|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
也许C#刚上市的时候有些抄袭Java吧,但自从C#2.0上市之后,整个局面就扭转乾坤了,不但Java在模仿C#,而且他从来都没能跟得上C#的脚步。Attribute的基础观点
常常有伴侣问,Attribute是甚么?它有甚么用?仿佛没有这个东东程序也能运转。实践上在.Net中,Attribute是一个十分主要的构成部分,为了匡助人人了解和把握Attribute,和它的利用办法,专程搜集了几个Attribute利用的例子,供应给人人参考。
在详细的演示之前,我想先大抵先容一下Attribute。我们晓得在类的成员中有property成员,两者在中文中都做属性注释,那末它们究竟是不是统一个器材呢?从代码上看,分明分歧,起首就是它们的在代码中的地位分歧,其次就是写法分歧(Attribute必需写在一对方括符中)。
甚么是Atrribute
起首,我们一定Attribute是一个类,上面是msdn文档对它的形貌:
大众言语运转时同意你增加相似关头字的形貌声明,叫做attributes,它对程序中的元素举行标注,如范例、字段、办法和属性等。Attributes和Microsoft.NETFramework文件的元数据保留在一同,能够用来向运转时形貌你的代码,大概在程序运转的时分影呼应用程序的举动。
在.NET中,Attribute被用来处置多种成绩,好比序列化、程序的平安特性、避免立即编译器对程序代码举行优化从而代码简单调试等等。上面,我们先来看几个在.NET中尺度的属性的利用,稍后我们再回过火来会商Attribute这个类自己。(文中的代码利用C#编写,但一样合用一切基于.NET的一切言语)
Attribute作为编译器的指令
在C#中存在着必定数目的编译器指令,如:#defineDEBUG,#undefineDEBUG,#if等。这些指令专属于C#,并且在数目上是流动的。而Attribute用作编译器指令则不受数目限定。好比上面的三个Attribute:
1,Conditional:起前提编译的感化,只要满意前提,才同意编译器对它的代码举行编译。一样平常在程序调试的时分利用。
2,DllImport:用来标志非.NET的函数,标明该办法在一个内部的DLL中界说。
3,Obsolete:这个属性用来标志以后的办法已被放弃,不再利用了。
上面的代码演示了上述三个属性的利用:
#defineDEBUG//这里界说前提
usingSystem;
usingSystem.Runtime.InteropServices;
usingSystem.Diagnostics;
namespaceAttributeDemo
{
classMainProgramClass
{
[DllImport("User32.dll")]
publicstaticexternintMessageBox(inthParent,stringMessage,stringCaption,intType);
staticvoidMain(string[]args)
{
DisplayRunningMessage();
DisplayDebugMessage();
MessageBox(0,"Hello","Message",0);
Console.ReadLine();
}
[Conditional("DEBUG")]
privatestaticvoidDisplayRunningMessage()
{
Console.WriteLine("入手下手运转Main子程序。以后工夫是"+DateTime.Now);
}
[Conditional("DEBUG")]
[Obsolete]
privatestaticvoidDisplayDebugMessage()
{
Console.WriteLine("入手下手Main子程序");
}
}
}
假如在一个程序元素后面声明一个Attribute,那末就暗示这个Attribute被施加到该元素上,后面的代码,[DllImport]施加到MessageBox函数上,[Conditional]施加到DisplayRuntimeMessage办法和DisplayDebugMessage办法,[Obsolete]施加到DisplayDebugMessage办法上。
依据下面触及到的三个Attribute的申明,我们能够猜到程序运转的时分发生的输入:DllImportAttribute标明了MessageBox是User32.DLL中的函数,如许我们就能够像外部办法一样挪用这个函数。
主要的一点就是Attribute就是一个类,以是DllImport也是一个类,Attribute类是在编译的时分被实例化的,而不是像一般的类那样在运转时分才实例化。Attribute实例化的时分依据该Attribute类的计划能够带参数,也能够不带参数,好比DllImport就带有"User32.dll"的参数。Conditional对满意参数的界说前提的代码举行编译,假如没有界说DEBUG,那末该办法将不被编译,读者能够把#defineDEBUG一行正文失落看看输入的了局(release版本,在Debug版本中Conditional的debug老是建立的)。Obsolete标明了DispalyDebugMessage办法已过期了,它有一个更好的办法来取代它,当我们的程序挪用一个声了然Obsolete的办法时,那末编译器会给出信息,Obsolete另有其他两个重载的版本。人人能够参考msdn中关于的ObsoleteAttribute类的形貌。
Attribute类
除.NET供应的那些Attribute派生类以外,我们能够自界说我们本人的Attribute,一切自界说的Attribute必需从Attribute类派生。如今我们来看一下Attribute类的细节:
protectedAttribute():回护的机关器,只能被Attribute的派生类挪用。
三个静态办法:
1,staticAttributeGetCustomAttribute():这个办法有8种重载的版本,它被用来掏出施加在类成员上指定范例的Attribute。
2,staticAttribute[]GetCustomAttributes():这个办法有16种重载版本,用来掏出施加在类成员上指定范例的Attribute数组。
3,staticboolIsDefined():由八种重载版本,看是不是指定范例的定制attribute被施加到类的成员下面。
实例办法:
boolIsDefaultAttribute():假如Attribute的值是默许的值,那末前往true。
boolMatch():标明这个Attribute实例是不是即是一个指定的工具。
大众属性:TypeId:失掉一个独一的标识,这个标识被用来辨别统一个Attribute的分歧实例。
我们复杂地先容了Attribute类的办法和属性,另有一些是从object承继来的。这里就不列出来了。
上面先容怎样自界说一个Attribute:自界说一个Attribute其实不必要出格的常识,实在就和编写一个类差未几。自界说的Attribute必需间接大概直接地从Attribute这个类派生,如:
publicMyCustomAttribute:Attribute{...}
这里必要指出的是Attribute的定名标准,也就是你的Attribute的类名+"Attribute",当你的Attribute施加到一个程序的元素上的时分,编译器先查找你的Attribute的界说,假如没有找到,那末它就会查找“Attribute称号"+Attribute的界说。假如都没有找到,那末编译器就报错。
关于一个自界说的Attribute,你能够经由过程AttributeUsage的Attribute来限制你的Attribute所施加的元素的范例。代码情势以下:[AttriubteUsage(参数设置)]public自界说Attribute:Attribute{...}
十分成心思的是,AttributeUsage自己也是一个Attribute,这是专门施加在Attribute类的Attribute.AttributeUsage天然也是从Attribute派生,它有一个带参数的机关器,这个参数是AttributeTargets的列举范例。上面是AttributeTargets的界说:
publicenumAttributeTargets
{
All=16383,
Assembly=1,
Module=2,
Class=4,
Struct=8,
Enum=16,
Constructor=32,
Method=64,
Property=128,
Field=256,
Event=512,
Interface=1024,
Parameter=2048,
Delegate=4096,
ReturnValue=8192
}
作为参数的AttributeTarges的值同意经由过程“或”操纵来举行多个值得组合,假如你没有指定参数,那末默许参数就是All。AttributeUsage除承继Attribute的办法和属性以外,还界说了以下三个属性:
1,AllowMultiple:读取大概设置这个属性,暗示是不是能够对一个程序元素施加多个Attribute。
2,Inherited:读取大概设置这个属性,暗示是不是施加的Attribute能够被派生类承继大概重载。
3,ValidOn:读取大概设置这个属性,指明Attribute能够被施加的元素的范例。
AttributeUsage的利用例子:
usingSystem;
namespaceAttTargsCS
{
//该Attribute只对类无效.
[AttributeUsage(AttributeTargets.Class)]
publicclassClassTargetAttribute:Attribute
{}
//该Attribute只对办法无效.
[AttributeUsage(AttributeTargets.Method)]
publicclassMethodTargetAttribute:Attribute
{}
//该Attribute只对机关器无效。
[AttributeUsage(AttributeTargets.Constructor)]
publicclassConstructorTargetAttribute:Attribute
{}
//该Attribute只对字段无效.
[AttributeUsage(AttributeTargets.Field)]
publicclassFieldTargetAttribute:Attribute
{}
//该Attribute对类大概办法无效(组合).
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)]
publicclassClassMethodTargetAttribute:Attribute
{}
//该Attribute对一切的元素无效.
[AttributeUsage(AttributeTargets.All)]
publicclassAllTargetsAttribute:Attribute
{}
//下面界说的Attribute施加到程序元素上的用法
[ClassTarget]//施加到类
[ClassMethodTarget]//施加到类
[AllTargets]//施加到类
publicclassTestClassAttribute
{
[ConstructorTarget]//施加到机关器
[AllTargets]//施加到机关器
TestClassAttribute()
{}
[MethodTarget]//施加到办法
[ClassMethodTarget]//施加到办法
[AllTargets]//施加到办法
publicvoidMethod1()
{}
[FieldTarget]//施加到字段
[AllTargets]//施加到字段
publicintmyInt;
staticvoidMain(string[]args)
{}
}
}
至此,我们先容了有关Attribute类和它们的代码格局。你必定想晓得究竟怎样在你的使用程序中利用Attribute,假如仅仅是后面先容的内容,仍是不敷以申明Attribute有甚么有用代价的话,那末从前面的章节入手下手我们将先容几个Attribute的分歧用法,信任你必定会对Attribute有一个新的懂得。Java欺骗了我们那么多年,如今的多核时代,我认为它气数已尽! |
|