仓酷云

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

[学习教程] NET网页编程之.Net中Attribute详解

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

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

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

x
学习asp.net两个月有余了,除了对html、web控件比较熟悉(应该是说都能理解和接受)之外,竟不知道自己还会什么。看了两本书:《精通asp.net网络编程》(人民邮电出版社)、《asp.net实用案例教程》(清华大学出版社)。Attribute的基础观点
在详细的演示之前,我想先大抵先容一下Attribute。我们晓得在类的成员中有property成员,两者在中文中都做属性注释,那末它们究竟是不是统一个器材呢?从代码上看,分明分歧,起首就是它们的在代码中的地位分歧,其次就是写法分歧(Attribute必需写在一对方括弧中)。

甚么是Atrribute
起首,我们看一下MSDN对它的注释:
大众言语运转时同意你增加相似关头字的形貌声明,叫做attributes,它对程序中的元素举行标注,如范例、字段、办法和属性等。Attributes和Microsoft.NETFramework文件的元数据保留在一同,能够用来向运转时形貌你的代码,大概在程序运转的时分影呼应用程序的举动。

在.NET中,Attribute被用来处置多种成绩,好比序列化、程序的平安特性、避免立即编译器对程序代码举行优化从而代码简单调试等等。上面,我们先来看几个在.NET中尺度的属性的利用,稍后我们再回过火来会商Attribute这个类自己。

Attribute作为编译器的指令
在C#中存在着必定数目的编译器指令,如:#defineDEBUG,#undefineDEBUG,#if等。这些指令专属于C#,并且在数目上是流动的。而Attribute用作编译器指令则不受数目限定。好比上面的三个Attribute:
·Conditional:起前提编译的感化,只要满意前提,才同意编译器对它的代码举行编译。一样平常在程序调试的时分利用。
·DllImport:用来标志非.NET的函数,标明该办法在一个内部的DLL中界说。
·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("Release")]
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的办法和属性以外,还界说了以下三个属性:
AllowMultiple:读取大概设置这个属性,暗示是不是能够对一个程序元素施加多个Attribute。
Inherited:读取大概设置这个属性,暗示是不是施加的Attribute能够被派生类承继大概重载。
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有一个新的懂得。什么叫数据库怎么样?什么意思?你想单学数据库。(其实变成是我问的)
蒙在股里 该用户已被删除
沙发
发表于 2015-1-18 13:41:11 来自手机 | 只看该作者
如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。
谁可相欹 该用户已被删除
板凳
发表于 2015-1-26 22:02:52 | 只看该作者
我的意思是.net好用,从功能上来说比JAVA强还是很明显的。
地板
发表于 2015-2-4 22:34:24 | 只看该作者
弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
只想知道 该用户已被删除
5#
发表于 2015-2-10 22:35:02 | 只看该作者
平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。
乐观 该用户已被删除
6#
发表于 2015-3-1 17:16:41 | 只看该作者
是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。
不帅 该用户已被删除
7#
发表于 2015-3-17 11:29:15 | 只看该作者
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
再现理想 该用户已被删除
8#
发表于 2015-3-24 10:01:12 | 只看该作者
那么,ASP.Net有哪些改进呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 00:39

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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