深爱那片海 发表于 2015-1-18 11:25:00

ASP.NET教程之[你必需晓得的.NET] 第三回:汗青纠葛:特征和属性仓酷云

你觉得数据库怎么样?系列文章目次索引:《你必需晓得的.NET》
本文将先容以下内容:
•定制特征的基础观点和用法
•属性与特征的区分对照
•反射的复杂先容
1.弁言
attribute是.NET框架引进的有一手艺亮点,因而我们有需要花点工夫来懂得本文的内容,走进一个发明attribute登堂进室的出口。由于.NETFramework中利用了大批的定制特征来完成代码商定,、、、这些的机关,信任我们都见过吧,那末你是不是懂得其面前的手艺。
提起特征,因为初级言语开展的汗青缘故原由,难免让人想起另外一个耳熟能详的名字:属性。特征和属性,常常给初学者大概从C++转移到C#的人搅浑的观点打击。那末,甚么是属性,甚么是特征,两者的观点和区分,用法与示例,将在本文做以归纳综合性的总结和对照,但愿给你的了解带来劳绩。别的本文的主题以特征的先容为主,属性的叙述重点凸起在两者的对照上,关于属性的更多叙述将在另外一篇主题中具体会商,敬请存眷。
2.观点引进
2.1.甚么是特征?
MADN的界说为:大众言语运转时同意增加相似关头字的形貌声明,叫做attributes,它对程序中的元素举行标注,如范例、字段、办法和属性等。Attributes和Microsoft.NETFramework文件的元数据保留在一同,能够用来向运转时形貌你的代码,大概在程序运转的时分影呼应用程序的举动。
我们复杂的总结为:定制特征attribute,实质上是一个类,其为方针元素供应联系关系附加信息,并在运转期以反射的体例来猎取附加信息。详细的特征完成办法,在接上去的会商中持续深切。
2.2.甚么是属性?
属性是面向对象编程的基础观点,供应了对公有字段的会见封装,在C#中以get和set会见器办法完成对可读可写属性的操纵,供应了平安和天真的数据会见封装。关于属性的观点,不是本文的重点,并且信任年夜部分的手艺职员应当对属性有明晰的观点。以下是复杂的属性示例:

publicclassMyProperty
{
//界说字段
privatestring_name;
privateint_age;

//界说属性,完成对_name字段的封装
publicstringName
{
get{return(_name==null)?string.Empty:_name;}
set{_name=value;}
}

//界说属性,完成对_age字段的封装
//到场对字段的局限把持
publicintAge
{
get{return_age;}
set
{
if((value>0)&&(value<150))
{
_age=value;
}
else
{
thrownewException("Notarealage");
}
}
}
}

publicclassMyTest
{
publicstaticvoidMain(string[]args)
{
MyPropertymyProperty=newMyProperty();
//触发set会见器
myProperty.Name="Anytao";
//触发get会见器
Console.WriteLine(myProperty.Name);
myProperty.Age=66;
Console.WriteLine(myProperty.Age.ToString());
Console.ReadLine();
}
}
2.3.区分与对照
经由过程对观点的廓清和汗青的回溯,我们晓得特征和属性只是在称号上有过纠葛,在MSDN上关于attribute的中文注释乃至仍是属性,可是我批准更一般的称号:特征。在功效上和使用上,两者实在没有太多含混的观点交织,因而也没有需要来对照其使用的异同点。本文则以特征的观点为重点,来会商其使用的场所和划定规矩。
我了解的定制特征,就是为方针元素,能够是数据集、模块、类、属性、办法、乃至函数参数等到场附加信息,相似于正文,可是能够在运转期以反射的体例取得。定制特征次要使用在序列化、编译器指令、计划形式等方面。
3.通用划定规矩

[*]定制特征能够使用的方针元素能够为:程序集(assembly)、模块(module)、范例(type)、属性(property)、事务(event)、字段(field)、办法(method)、参数(param)、前往值(return),应当全了。
[*]定制特征以[,]情势展示,放在紧挨着的元素上,多个特征能够使用于统一元素,特征间以逗号离隔,以下表达划定规矩无效:、、、
[*]attibute实例,是在编译期举行初始化,而不是运转期。
[*]C#同意以指定的前缀来暗示特征所使用的方针元素,倡议如许来处置,由于显式处置能够打消大概带来的二义性。比方:usingSystem;

namespaceAnytao.net
{
//使用于程序集
//使用于模块
pubicclassAttribute_how2do
{
//
}
}
[*]定制特征范例,必需间接大概直接的承继自System.Attribute类,并且该范例必需有私有机关函数来创立实在例。
[*]一切自界说的特征称号都应当有个Attribute后缀,这是习气性商定。
[*]定制特征也能够使用在其他定制特征上,这点也很好了解,由于定制特征自己也是一个类,恪守类的私有划定规矩。比方良多时分我们的自界说定制特征会使用AttributeUsageAttribute特征,来把持怎样使用新界说的特征。[AttributeUsageAttribute(AttributeTarget.All),
AllowMultiple=true,
Inherited=true]
classMyNewAttribute:System.Attribute
{
//
}
[*]定制特征不会影呼应用元素的任何功效,只是商定了该元素具有的特质。
[*]一切非笼统特征必需具有public会见限定。
[*]特征经常使用于编译器指令,冲破#define,#undefine,#if,#endif的限定,并且加倍天真。
[*]定制特征经常使用于在运转期取得代码正文信息,以附加信息来优化调试。
[*]定制特征能够使用在某些计划形式中,如工场形式。
[*]定制特征还经常使用于位标志,非托管函数标志、办法放弃标志等其他方面。
4.特征的使用
4.1.经常使用特征
经常使用特征,也就是.NET已供应的固有特征,现实上在.NET框架中已供应了丰厚的固有特征由我们发扬,以下精选出我以为最经常使用、最典范的固有特征做以复杂会商,固然这只是我的一家之言,亦不敷道。我想懂得特征,仍是从这里做为出发点,从.NET供应的典范入手下手,也许是一种求知的捷径,但愿能给人人以启发。

[*]AttributeUsageAttributeUsage特征用于把持怎样使用自界说特征到方针元素。关于AttributeTargets、AllowMultiple、Inherited、ValidOn,请参阅示例申明和其他文档。我们已做了相称的先容和示例申明,我们仍是在理论中本人体味更多吧。

[*]Flags
以Flags特征来将列举数值看做位标志,而非独自的数值,比方:
enumAnimal
{
Dog=0x0001,
Cat=0x0002,
Duck=0x0004,
Chicken=0x0008
}因而,以下完成就相称轻松,
Animalanimals=Animal.Dog|Animal.Cat;
Console.WriteLine(animals.ToString());请推测了局是甚么,谜底是:"Dog,Cat"。假如没有Flags出格,这里的了局将是"3"。关于位标志,也将在本系列的后续章回中有所交卸,在此只做以切磋止步。

[*]DllImportDllImport特征,可让我们挪用非托管代码,以是我们可使用DllImport特征引进对Win32API函数的挪用,关于习气了非托管代码的程序员来讲,这一特征无疑是拯救的稻草。
usingSystem;
usingSystem.Runtime.InteropServices;

namespaceAnytao.net
{
classMainClass
{

publicstaticexternintMessageBox(inthParent,stringmsg,stringcaption,inttype);

staticintMain()
{
returnMessageBox(0,"Howtouseattributein.NET","Anytao_net",0);
}
}
}
[*]SerializableSerializable特征标明了使用的元素能够被序列化(serializated),序列化和反序列化是另外一个能够深切会商的话题,在此我们只是提出观点,深切的研讨有待以专门的主题来出现,限于篇幅,此不赘述。

[*]ConditionalConditional特征,用于前提编译,在调试时利用。注重:Conditional不成使用于数据成员和属性。

另有其他的主要特征,包含:Description、DefaultValue、Category、ReadOnly、BrowerAble等,偶然间能够深切研讨。
4.2.自界说特征
既然attribute,实质上就是一个类,那末我们就能够自界说更特定的attribute来满意本性化请求,只需恪守上述的12条划定规矩,完成一个自界说特征实际上是很简单的,典范的完成办法为:

[*]界说特征[AttributeUsage(AttributeTargets.Class|
AttributeTargets.Method,
Inherited=true)]
publicclassTestAttribute:System.Attribute
{
publicTestAttribute(stringmessage)
{
Console.WriteLine(message);
}
publicvoidRunTest()
{
Console.WriteLine("TestAttributehere.");
}
}
[*]使用方针元素
publicvoidCannotRun()
{
//
}
[*]猎取元素附加信息假如没有甚么机制来在运转期来猎取Attribute的附加信息,那末attribute就没有甚么存在的意义。因而,.NET中以反射机制来完成在运转期猎取attribute信息,完成办法以下:
publicstaticvoidMain()
{
Testert=newTester();
t.CannotRun();

Typetp=typeof(Tester);
MethodInfomInfo=tp.GetMethod("CannotRun");
TestAttributemyAtt=(TestAttribute)Attribute.GetCustomAttribute(mInfo,typeof(TestAttribute));
myAtt.RunTest();
}
5.典范示例

5.1小菜一碟
啥也不说了,看正文吧。
usingSystem;
usingSystem.Reflection;//使用反射手艺取得特征信息

namespaceAnytao.net
{
//定制特征也能够使用在其他定制特征上,
//使用AttributeUsage,来把持怎样使用新界说的特征
[AttributeUsageAttribute(AttributeTargets.All,//可使用任何元素
AllowMultiple=true,//同意使用屡次
Inherited=false)]//不承继到派生类
//特征也是一个类,
//必需承继自System.Attribute类,
//定名标准为:"类名"+Attribute。
publicclassMyselfAttribute:System.Attribute
{
//界说字段
privatestring_name;
privateint_age;
privatestring_memo;

//必需界说其机关函数,假如不界说有编译器供应无参默许机关函数
publicMyselfAttribute()
{
}
publicMyselfAttribute(stringname,intage)
{
_name=name;
_age=age;
}

//界说属性
//明显特征和属性不是一回事儿
publicstringName
{
get{return_name==null?string.Empty:_name;}
}

publicintAge
{
get{return_age;}
}

publicstringMemo
{
get{return_memo;}
set{_memo=value;}
}

//界说办法
publicvoidShowName()
{
Console.WriteLine("Hello,{0}",_name==null?"world.":_name);
}
}

//使用自界说特征
//能够以Myself大概MyselfAttribute作为特征名
//能够给属性Memo赋值

publicclassMytest
{
publicvoidSayHello()
{
Console.WriteLine("Hello,my.networld.");
}
}

publicclassMyrun
{
publicstaticvoidMain(string[]args)
{
//怎样以反射断定特征信息
Typetp=typeof(Mytest);
MemberInfoinfo=tp;
MyselfAttributemyAttribute=
(MyselfAttribute)Attribute.GetCustomAttribute(info,typeof(MyselfAttribute));
if(myAttribute!=null)
{
//嘿嘿,在运转时检察正文内容,是否是很爽
Console.WriteLine("Name:{0}",myAttribute.Name);
Console.WriteLine("Age:{0}",myAttribute.Age);
Console.WriteLine("Memoof{0}is{1}",myAttribute.Name,myAttribute.Memo);
myAttribute.ShowName();
}

//多点反射
objectobj=Activator.CreateInstance(typeof(Mytest));

MethodInfomi=tp.GetMethod("SayHello");
mi.Invoke(obj,null);
Console.ReadLine();
}
}
}啥也别想了,本人做一下尝尝。
5.2参考之资


[*]MSDN以为,特征(Attribute)形貌怎样将数据序列化,指定用于强迫平安性的特征,并限定及时(JIT)编译器的优化,从而使代码易于调试。属性(Attribute)还能够纪录文件名或代码作者,或在窗体开辟阶段把持控件和成员的可见性。
[*]duduBoss保藏的系列文章《Attribute在.net编程中的使用》,给你使用方面的启发会良多,值得研讨。
[*]亚历山年夜同道的系列文章《手把手教你写ORM(六)》中,也有很好的解释。
[*]idior的文章《Remoting基础道理及其扩大机制》也有劳绩,因而增补。
6.结论
Attribute是.NET引进的一年夜特征手艺,但在博客园中会商的不是良多,以是拿出本人的体味来分享,但愿就这一手艺要点举行一番登堂进室的引诱。更深条理的使用,比方序列化、程序平安性、计划形式多方面都能够发掘出闪灼的金子,这就是.NET在手艺范畴带来的百变魅力吧。但愿人人各抒己见,来完美和增补作者在这方面的不周全和认知上的不深切,那将是作者最年夜的勉励和动力。

<br>
参考文献
(USA)StanleyB.Lippman,C#Primer

老尸 发表于 2015-1-21 05:38:31

但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。

小妖女 发表于 2015-1-30 08:52:02

我的意思是.net好用,从功能上来说比JAVA强还是很明显的。

乐观 发表于 2015-2-6 09:16:56

Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。

简单生活 发表于 2015-2-6 13:53:43

碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。

活着的死人 发表于 2015-2-16 08:45:52

逐步缩小出错代码段的范围,最终确定错误代码的位置。

分手快乐 发表于 2015-2-25 00:31:46

现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。

深爱那片海 发表于 2015-3-7 09:38:38

asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源

仓酷云 发表于 2015-3-14 17:25:24

代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。

第二个灵魂 发表于 2015-3-21 12:23:25

这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。
页: [1]
查看完整版本: ASP.NET教程之[你必需晓得的.NET] 第三回:汗青纠葛:特征和属性仓酷云