zoukankan      html  css  js  c++  java
  • [转]学习C#:Attribute与Property

    一.什么是Attribute

    先看下面的三段代码:

    1.自定义Attribute类:VersionAttribute

    [AttributeUsage(AttributeTargets.Class)]  
    public class VersionAttribute : Attribute  
    {  
        public string Name { get; set; }  
        public string Date { get; set; }  
        public string Describtion { get; set; }  
    } 

    2.使用自定义Attribute的Class:

    [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]  
    public class MyCode  
    {  
        //...  
    } 

    3.上面这个Class中的Attribute一般会被如何使用呢?

    class Program  
    {  
        static void Main(string[] args)  
        {  
            var info = typeof(MyCode);  
            var classAttribute = (VersionAttribute)Attribute.GetCustomAttribute(info, typeof(VersionAttribute));  
            Console.WriteLine(classAttribute.Name);  
            Console.WriteLine(classAttribute.Date);  
            Console.WriteLine(classAttribute.Describtion);  
        }  
    } 

    示例完毕!上面三段代码相信已经说明了Attribute大概是一个什么东西和怎么去用。

    二.深入讨论Attribute

    1.Attribute的概念定义

    关于Attribute概念的定义,我直接引用《你必须知道的.NET之特性和属性》中的一段来说明:

    MADN的定义为:公共语言运行时允许添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据(metadata)保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。

    我们简单的总结为:定制特性attribute,本质上是一个类,其为目标元素提供关联附加信息,并在运行期以反射的方式来获取附加信息。

    噢,原来Attribute的目的是为元素提供关联附加信息。其中,上面第一段代码中“[AttributeUsage(AttributeTargets.Class)] ”说明了Attribute提供附加信息的元素是Class,所以如果上面第二段的代码改为:

    public class MyCode  
    {  
        [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]  
        public void Test() { }  
    }  

    会出现编译错误。

    2.Attribute作为编译指令

    Attribute类是在编译的时候被实例化的,而不是像通常的类那样在运行时候才实例化。所以在第三段代码中,你可以在没有实例化MyCode对象的情况下取到MyCode的Attribute信息。由于Attribute类是在编译的时候被实例化的,所以你还可以用外部工具维护这些Attribute信息。

    3.Attribute与Property

    从中文来说,Attribute和Property的中文都叫“属性”,很容易让人混淆。现在的文章,Attribute一般翻译为”特性”,而Property称为“属性”。

    或许你会问,我用静态的Property/Field一样可以做到在不实例化的时候拿到一些信息,如果这样的话,Attribute又有什么存在意义呢?

    1.Property:

    Property可以说是一个面向对象的概念,提供了对私有字段的访问封装,在C#中以get和set访问器方法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。比如:

    public class Robot  
    {  
        private string name = "";   //字段:Field  
        public string Name          //属性:Property,对Field进行封装。  
          {  
            get { return name; }  
            set { name = value; }  
        }  
    } 

    2.Attribute:

    Attribute的目标是:为元素提供附加信息。它的作用更类似于注释。

    可以说,Property/Field和Attribute是两个完全不同的概念,虽然他们有些时候能做一样的事,但请记住,他们是从本质上就不同的两个东西。

    三.实现自己的Attribute时需要注意的一些问题

    1.自定义的Attribute必须直接或者间接继承System.Attribute。

    2.这里有一个约定:所有自定义的特性名称都应该有个Attribute后缀。因为当你的Attribute施加到一个程序的元素上的时候,编译器先查找你的Attribute的定义,如果没有找到,那么它就会查找“Attribute名称"+Attribute的定义。如果都没有找到,那么编译器就报错。这就是为什么我可以再上面第一段代码中,定义一个VersionAttribute,但在第二段代码中,我使用却是Version这个Attribute。:>

    下面是一些开发自定义Attribute时,可能需要用到的资料:

    【1】Attribute可以关联的元素包括:

    程序集(assembly)、模块(module)、类型(type)、属性(property)、事件(event)、字段(field)、方法(method)、参数(param)、返回值(return)。例如:

    [assembly: Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]  
    public class MyCode  
    {  
        //......  
    } 

    用指定的前缀来表示特性所应用的目标元素,建议这样来处理,因为显式处理可以消除可能带来的二义性。

    【2】AttributeTargets目标包括:

    【3】AttributeUsageAttribute中的3个属性(Property)说明:

    四.参考资料

    【1】Msdn

    【2】《你必须知道的.NET之特性和属性》,博主严重推荐!

    【3】《Attribute在.net编程中的应用》系列文章

    【编辑推荐】

    1. C#自定义控件的开发:Pin和Connector
    2. 比较C#自定义控件的property(属性)和/attribute(性质)
    3. C#组件开发:COM和.NET对象之间的互操作
    4. 介绍.NET平台、C#和ASP.NET
    5. C# Attributes:定义设计期信息

    引文连接:学习C#:Attribute与Property

  • 相关阅读:
    HDU 5528 Count a * b 欧拉函数
    HDU 5534 Partial Tree 完全背包
    HDU 5536 Chip Factory Trie
    HDU 5510 Bazinga KMP
    HDU 4821 String 字符串哈希
    HDU 4814 Golden Radio Base 模拟
    LA 6538 Dinner Coming Soon DP
    HDU 4781 Assignment For Princess 构造
    LA 7056 Colorful Toy Polya定理
    LA 6540 Fibonacci Tree
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/4675269.html
Copyright © 2011-2022 走看看