什么是Atrribute
首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述:
公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。
在.NET中,Attribute被用来处理多种问题,比如序列化、程序的安全特征、防止即时编译器对程序代码进行优化从而代码容易调试等等。下面,我们先来看几个在.NET中标准的属性的使用,稍后我们再回过头来讨论Attribute这个类本身。(文中的代码使用C#编写,但同样适用所有基于.NET的所有语言)
Attribute作为编译器的指令
在C#中存在着一定数量的编译器指令,如:#define DEBUG, #undefine DEBUG, #if等。这些指令专属于C#,而且在数量上是固定的。而Attribute用作编译器指令则不受数量限制。比如下面的三个Attribute:
- Conditional:起条件编译的作用,只有满足条件,才允许编译器对它的代码进行编译。一般在程序调试的时候使用。
- DllImport:用来标记非.NET的函数,表明该方法在一个外部的DLL中定义。
- Obsolete:这个属性用来标记当前的方法已经被废弃,不再使用了。
[Conditional("DEBUG")] private static void DisplayRunningMessage(){}
[DllImport("User32.dll")]
public static extern int MessageBox(int hParent, string Message, string Caption, int Type);
[Obsolete("如果需要更高性能的日志模块请使用 LogHelper")] public static class Log{}
//编译时会出现警告:“****”已过时:“如果需要更高性能的日志模块请使用 LogHelper”
[Flags]
[WebMethod(true, Description = "微支付回调")]
[Conditional("DEBUG")] public void DEBUGLog(string log) { Log.WriteLine("测试日志:" + log); }
Obsolete 属性将某个程序实体标记为一个建议不再使用的实体。每次使用被标记为已过时的实体时,随后将生成警告或错误,这取决于属性是如何配置的。例如:
[System.Obsolete("use class B")]
class A
{
public void Method() { }
}
class B
{
[System.Obsolete("use NewMethod", true)]
public void OldMethod() { }
public void NewMethod() { }
}
在此例中,Obsolete 属性应用于类 A 和方法 B.OldMethod。由于应用于 B.OldMethod 的属性构造函数的第二个参数设置为 true,因此使用此方法将导致编译器错误,而使用类 A 只会产生警告。但是,调用B.NewMethod 既不产生警告也不产生错误。
向属性构造函数提供的作为第一个参数的字符串将显示为警告或错误的一部分。例如,当与前面的定义一起使用时,下面的代码将生成两个警告和一个错误:
Attribute类
除了.NET提供的那些Attribute派生类之外,我们可以自定义我们自己的Attribute,所有自定义的Attribute必须从Attribute类派生。
浙公网安备 33010602011771号