C#特性

时间:2024-06-09 22:34:08

  一、概念: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表示不能继承到派生类,也就是说不能用在派生类。

    

 //限定特性类的应用范围
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Field, AllowMultiple = true, Inherited = false)]
//定制MsgAttribute特性类,继承于Attribute
public class ClassMsgAttribute : Attribute
{
//定义_msg字段和Msg属性//Msg属性用于读写msg字段
string _msg;
public string Msg { get { return _msg; } set { _msg = value; } }
public ClassMsgAttribute() { }
//重载构造函数接收一个参数,赋值给_msg字段
public ClassMsgAttribute(string s) { _msg = s; } 
}
 //在Person类上标记ClassMsg特性
[ClassMsg(Msg = "这是关于人的姓名信息的类")]
class Person
{
//在_name字段上应用ClassMsg特性
[ClassMsg("这是存储姓名的字段")]
string _name;
//以下特性无法应用,因为MsgAttribute定义的特性只能用于类和字段
//[ClassMsg("这是读写姓名字段的属性")]
public string Name { get { return _name; } set { _name = value; } }
}

转载自:http://blog.****.net/helloguonan/article/details/5912032

参考:http://www.kuqin.com/dotnet/20080628/10196.html