解释一下 C# 中的特性:什么是特性?特性的特征?特性的作用?如何编写特性?最好用实例说明。
1个回答
展开全部
C# 特性(Attribute)详细介绍 1、什么是Atrribute 首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。 在.NET中,Attribute被用来处理多种问题,比如序列化、程序的安全特征、防止即时编译器对程序代码进行优化从而代码容易调试等等。下面,我们先来看几个在.NET中标准的属性的使用,稍后我们再回过头来讨论Attribute这个类本身。(文中的代码使用C#编写,但同样适用所有基于.NET的所有语言) 2、Attribute作为编译器的指令 在C#中存在着一定数量的编译器指令,如:#define DEBUG, #undefine DEBUG, #if等。这些指令专属于C#,而且在数量上是固定的。而Attribute用作编译器指令则不受数量限制。比如下面的三个Attribute: Conditional:起条件编译的作用,只有满足条件,才允许编译器对它的代码进行编译。一般在程序调试的时候使用。 DllImport:用来标记非.NET的函数,表明该方法在一个外部的DLL中定义。 Obsolete:这个属性用来标记当前的方法已经被废弃,不再使用了。 下面的代码演示了上述三个属性的使用: 1#define DEBUG //这里定义条件 2 3using System; 4using System.Runtime.InteropServices; 5using System.Diagnostics; 6 7namespace AttributeDemo 8{ 9 class MainProgramClass 10 { 11 12 [DllImport("User32.dll")] 13 public static extern int MessageBox(int hParent, string Message, string Caption, int Type); 14 15 static void Main(string[] args) 16 { 17 DisplayRunningMessage(); 18 DisplayDebugMessage(); 19 20 MessageBox(0,"Hello","Message",0); 21 22 Console.ReadLine(); 23 } 24 25 [Conditional("DEBUG")] 26 private static void DisplayRunningMessage() 27 { 28 Console.WriteLine("开始运行Main子程序。当前时间是"+DateTime.Now); 29 } 30 31 [Conditional("DEBUG")] 32 //[Obsolete("Don't use Old method, use New method", true)] 33 [Obsolete] 34 private static void DisplayDebugMessage() 35 { 36 Console.WriteLine("开始Main子程序"); 37 } 38 } 39} 如果在一个程序元素前面声明一个Attribute,那么就表示这个Attribute被施加到该元素上,前面的代码,[DllImport]施加到MessageBox函数上, [Conditional]施加到DisplayRuntimeMessage方法和DisplayDebugMessage方法,[Obsolete]施加到DisplayDebugMessage方法上。 根据上面涉及到的三个Attribute的说明,我们可以猜到程序运行的时候产生的输出:DllImport Attribute表明了MessageBox是User32.DLL中的函数,这样我们就可以像内部方法一样调用这个函数。 重要的一点就是Attribute就是一个类,所以DllImport也是一个类,Attribute类是在编译的时候被实例化的,而不是像通常的类那样在运行时候才实例化。Attribute实例化的时候根据该Attribute类的设计可以带参数,也可以不带参数,比如DllImport就带有"User32.dll"的参数。Conditional对满足参数的定义条件的代码进行编译,如果没有定义DEBUG,那么该方法将不被编译,读者可以把#define DEBUG一行注释掉看看输出的结果(release版本,在Debug版本中Conditional的debug总是成立的)。Obsolete表明了DispalyDebugMessage方法已经过时了,它有一个更好的方法来代替它,当我们的程序调用一个声明了Obsolete的方法时,那么编译器会给出信息,Obsolete还有其他两个重载的版本。大家可以参考msdn中关于的ObsoleteAttribute 类的描述。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询