仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 760|回复: 8
打印 上一主题 下一主题

[学习教程] 来一篇关于NET的.net中Attribuge的具体使用(一)

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:20:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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欺骗了我们那么多年,如今的多核时代,我认为它气数已尽!
老尸 该用户已被删除
沙发
发表于 2015-1-18 13:15:02 | 只看该作者
ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。
小魔女 该用户已被删除
板凳
发表于 2015-1-23 17:39:34 | 只看该作者
现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。
只想知道 该用户已被删除
地板
发表于 2015-1-31 19:04:45 来自手机 | 只看该作者
使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
柔情似水 该用户已被删除
5#
发表于 2015-2-6 23:33:17 | 只看该作者
业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
灵魂腐蚀 该用户已被删除
6#
发表于 2015-2-19 04:30:32 | 只看该作者
ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
不帅 该用户已被删除
7#
发表于 2015-3-6 13:04:21 | 只看该作者
市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。
深爱那片海 该用户已被删除
8#
发表于 2015-3-13 02:08:20 | 只看该作者
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
变相怪杰 该用户已被删除
9#
发表于 2015-3-20 10:04:33 | 只看该作者
在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 20:45

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表