代码之家  ›  专栏  ›  技术社区  ›  Corey Ogburn

C#属性及其使用

  •  16
  • Corey Ogburn  · 技术社区  · 14 年前

    [Serializable] . 然而,其他的似乎并不那么重要,比如我的同事用它来标记属性 [DataMember]

    我想我的问题是,什么是属性,它们如何有用?有没有一种方法可以创建自己的属性?如何判断字段/方法/类/任何东西是否具有特定属性,或者在这些属性中设置了哪些值?

    4 回复  |  直到 14 年前
        1
  •  21
  •   Eric Lippert    14 年前

    什么是属性?

    属性使您能够在描述某个类型或方法的元数据中嵌入有关该类型或方法的信息。

    You typically want to use attributes to describe facts about the mechanism of the type or method rather than the meaning of the type or method. 例如,假设您有一个类型Employee。一个关于 意思 机制 员工可以是。属性允许您将有关技术细节的信息从语义模型中分离出来。

    有没有办法创建自己的属性?

    我如何判断字段/方法/类/任何东西是否具有特定属性,或者在这些属性中设置了哪些值?

    对反射对象使用GetCustomAttributes方法。

    http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspx

        2
  •  7
  •   Reed Copsey    14 年前

    Attributes 是一种将元数据与.NET中的类型相关联的方法。这允许您检查一个类型并获取与该类型的“运行时”信息不同的信息。

    这可能非常有用。你提到 [Serializable] ,但其他简单的例子包括 System.ComponentModel 类型,例如 Description ,当您在设计器中处理属性时,属性网格使用它来“描述”属性。由于属性的“描述”实际上与程序中类型的行为(在运行时)无关,因此它不属于类。但是,当您在可视化设计器中编辑控件时(例如,查看属性的描述(或类别等),它非常方便。属性是处理此问题的方法。

        3
  •  6
  •   Community kfsone    7 年前

    我想下面这个问题的答案会让你对你的问题有所了解。

    How do attribute classes work?

    这是我提供的答案的转载。

    属性几乎可以应用于代码的每个方面。例如,可以在程序集级别关联属性,如AssemblyVersion和AssemblyFileVersion属性,它们控制与程序集关联的版本号。

    [assembly: AssemblyVersion("1.0.0.0")]
    [assembly: AssemblyFileVersion("1.0.0.0")]
    

    例如,可以将Serializable属性应用于类型声明,以将该类型标记为支持序列化。事实上,这个属性在CLR中有特殊的含义,实际上是作为一个特殊的指令直接存储在IL中的类型上,它被优化为存储为一个位标志,可以更有效地进行处理,在这个性质上有一些属性,称为伪自定义属性。

    http://msdn.microsoft.com/en-us/library/system.attributetargets(VS.90).aspx

    此外,您还可以定义自己的自定义属性,然后将这些属性应用于您的属性所针对的适用目标。然后在运行时,您的代码可以反映自定义属性中包含的值并采取适当的操作。

    举个很幼稚的例子,这只是为了举例:)

    TableMappingAttribute
    ColumnMappingAttribute
    

    [TableMapping("People")]
    public class Person
    {
      [ColumnMapping("fname")]
      public string FirstName {get; set;}
    
      [ColumnMapping("lname")]
      public string LastName {get; set;}
    }
    

    在编译时,除了编译器发出由自定义属性定义的附加元数据这一事实之外,其他几乎没有受到影响。但是,您现在可以编写一个persistencemanager,它可以动态检查Person类实例的属性,并将数据插入People表,将FirstName属性中的数据映射到fname列,将LastName属性映射到lname列。

    至于关于属性实例的问题,属性实例并不是为类的每个实例创建的。所有人的实例都将共享TableMappingAttribute和ColumnMappingAttribute的同一个实例。实际上,属性实例仅在您第一次实际查询属性时创建。

        4
  •  0
  •   TrustyCoder    14 年前

    C#提供了一种定义声明性标记(称为属性)的机制,您可以将其放置在源代码中的某些实体上,以指定其他信息。属性包含的信息可以在运行时通过反射进行检索。可以使用预定义属性,也可以定义自己的自定义属性。

    http://msdn.microsoft.com/en-us/library/aa288059%28v=VS.71%29.aspx