一、概念:C#的特性也是一个类,继承自System.Attribute,用于描述类、方法、字段等
二、类型:
2.1 .net中特性用来处理多种问题,比如序列化、程序的安全特性、防止即时编译器对程序代码进行优化从而代码容易调试等等。
定制特性的本质上是一个类的元素上去添加附加信息,并在运行其通过反射得到该附加信息(在使用数据实体对象时经常用到)
2.2 Attribute 作为编译器的指令时的应用
Conditional:起条件编译的作用,只有满足条件,才允许编译器对它的代码进行编译。一般在程序调试的时候使用
DllImport: 用来标记费.net的函数,表明该方法在一个外部的DLL中定义。
Obsolete: 这个属性用来标记当前的方法已经废弃,不再使用
注:Attribute是一个类,因此DllImport也是一个类,Attribute类是在编译的时候实例化,而不是像通常那样在运行时实例化。
CLSCompliant: 保证整个程序集代码遵守CLS,否则编译将报错。
2.3 自定义特性
AttributeTargets.All :可以应用到任何元素。比如:类、字段、方法、属性等。AttributeTargets.Class 表示只能用在类上,不能用在方法或字段等,否则编译器会报错!
AllowMultiple=true: 表示可以多少使用,能否被重复放在同一个程序实体前多次。比如:可以应用在多个类或者方法,要看AttributeTargets的属性,若是AttributeTargets.Class,表示可以应用在多个
类。
Inherited=false:false表示不能继承到派生类,也就是说不能用在派生类。
1 //限定特性类的应用范围 2 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Field, AllowMultiple = true, Inherited = false)] 3 //定制MsgAttribute特性类,继承于Attribute 4 public class ClassMsgAttribute : Attribute 5 { 6 //定义_msg字段和Msg属性//Msg属性用于读写msg字段 7 string _msg; 8 public string Msg { get { return _msg; } set { _msg = value; } } 9 public ClassMsgAttribute() { } 10 //重载构造函数接收一个参数,赋值给_msg字段 11 public ClassMsgAttribute(string s) { _msg = s; } 12 }
1 //在Person类上标记ClassMsg特性 2 [ClassMsg(Msg = "这是关于人的姓名信息的类")] 3 class Person 4 { 5 //在_name字段上应用ClassMsg特性 6 [ClassMsg("这是存储姓名的字段")] 7 string _name; 8 //以下特性无法应用,因为MsgAttribute定义的特性只能用于类和字段 9 //[ClassMsg("这是读写姓名字段的属性")] 10 public string Name { get { return _name; } set { _name = value; } } 11 }
转载自:http://blog.csdn.net/helloguonan/article/details/5912032
参考:http://www.kuqin.com/dotnet/20080628/10196.html