|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
呵呵,那你就关注微软的招聘信息以及别人的招聘经验啊,还有也不一定去做技术的,你如果真的想去就多了解了解。(其实我的意思是说想到微软做技术是很不容易的。属性和元数据
C#和C++之间一个明显的区分是它供应了对元数据的撑持:有关类、工具、办法等其他实体的数据。属性能够分为二类:一类以CLR的一部分的情势呈现,另外一种是我们本人创立的属性,CLR属性用来撑持串行化、分列和COM协异性等。一些属性是针对一个组合体的,有些属性则是针对类或界面,它们也被称作是属性方针。
将属性放在属性方针前的方括号内,属性就能够感化于它们的属性方针。
[assembly:AssemblyDelaySign(false)]
[assembly:AssemblyKeyFile(".keyFile.snk")]
或用逗号将各个属性分隔:
[assembly:AssemblyDelaySign(false),
assembly:AssemblyKeyFile(".keyFile.snk")]
自界说的属性
我们能够恣意创立自界说属性,并在以为符合的时分利用它们。假定我们必要跟踪bug的修复情形,就必要创建一个包括bug的数据库,但必要将bug呈报与专门的修改情形绑定在一起,则大概在代码中增加以下所示的正文:
//Bug323fixedbyJesseLiberty1/1/2005.
如许,在源代码中就能够一览无余地懂得bug的修改情形,但假如假如把相干的材料保留在数据库中大概会更好,如许就更便利我们的查询事情了。假如一切的bug呈报都利用不异的语法那就更好了,但这时候我们就必要一个定制的属性了。我们大概利用上面的内容取代代码中的正文:
[BugFix(323,"JesseLiberty","1/1/2005")Comment="Offbyoneerror"]
与C#中的其他元素一样,属性也是类。定制化的属性类必要承继System.Attribute:
publicclassBugFixAttribute:System.Attribute
我们必要让编译器晓得这个属性能够跟甚么范例的元素,我们能够经由过程以下的体例来指定该范例的元素:
[AttributeUsage(AttributeTargets.ClassMembers,AllowMultiple=true)]
AttributeUsage是一个感化于属性的属性━━元属性,它供应的是元数据的元数据,也即有关元数据的数据。在这类情形下,我们必要传送二个参数,第一个是方针(在本例中是类成员。),第二个是暗示一个给定的元素是不是能够承受多于一个属性的标志。AllowMultiple的值被设置为true,意味着类成员能够有多于一个BugFixAttribute属性。假如要团结二个属性方针,可使用OR操纵符毗连它们。
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Interface,AllowMultiple=true)]
下面的代码将使一个属性从属于一个类或一个界面。
新的自界说属性被定名为BugFixAttribute。定名的划定规矩是在属性名以后增加Attribute。在将属性指派给一个元素后,编译器同意我们利用精简的属性名挪用这一属性。因而,上面的代码是正当的:
[BugFix(123,"JesseLiberty","01/01/05",Comment="Offbyone")]
编译器将起首查找名字为BugFix的属性,假如没有发明,则查找BugFixAttribute。
每一个属性必需最少有一个机关器。属性能够承受二品种型的参数:情况参数和定名参数。在后面的例子中,bugID、编程职员的名字和日期是情况参数,正文是定名参数。情况参数被传送到机关器中的,并且必需按在机关器中界说的按次传送。
publicBugFixAttribute(intbugID,stringprogrammer,stringdate)
{
this.bugID=bugID;
this.programmer=programmer;
this.date=date;
}
Namedparametersareimplementedasproperties.
属性的利用
为了对属性举行测试,我们创立一个名字为MyMath的复杂类,并给它增加二个函数,然后给它指定bugfix属性。
[BugFixAttribute(121,"JesseLiberty","01/03/05")]
[BugFixAttribute(107,"JesseLiberty","01/04/05",
Comment="Fixedoffbyoneerrors")]
publicclassMyMath
这些数据将与元数据存储在一同。上面是完全的源代码及其输入:
自界说属性
usingSystem;
//创立被指派给类成员的自界说属性
[AttributeUsage(AttributeTargets.Class,
AllowMultiple=true)]
publicclassBugFixAttribute:System.Attribute
{
//地位参数的自界说属性机关器
publicBugFixAttribute
(intbugID,
stringprogrammer,
stringdate)
{
this.bugID=bugID;
this.programmer=programmer;
this.date=date;
}
publicintBugID
{
get
{
returnbugID;
}
}
//定名参数的属性
publicstringComment
{
get
{
returncomment;
}
set
{
comment=value;
}
}
publicstringDate
{
get
{
returndate;
}
}
publicstringProgrammer
{
get
{
returnprogrammer;
}
}
//专有成员数据
privateintbugID;
privatestringcomment;
privatestringdate;
privatestringprogrammer;
}
//把属性指派给类
[BugFixAttribute(121,"JesseLiberty","01/03/05")]
[BugFixAttribute(107,"JesseLiberty","01/04/05",
Comment="Fixedoffbyoneerrors")]
publicclassMyMath
{
publicdoubleDoFunc1(doubleparam1)
{
returnparam1+DoFunc2(param1);
}
publicdoubleDoFunc2(doubleparam1)
{
returnparam1/3;
}
}
publicclassTester
{
publicstaticvoidMain()
{
MyMathmm=newMyMath();
Console.WriteLine("CallingDoFunc(7).Result:{0}",
mm.DoFunc1(7));
}
}
输入:
CallingDoFunc(7).Result:9.3333333333333339
象我们看到的那样,属性对输入相对没有影响,创立属性也不会影响代码的功能。到今朝为止,读者也只是在听我叙述有关属性的成绩,利用ILDASM扫瞄元数据,就会发明属性的确是存在的。
[img=1border=0style=,1src=]http://www.ckuyun.com/[/img]
我之所以想学。NET,是因为一直觉的BILLGATES好厉害,希望有一天能去微软,虽然现在还距离遥远,呵呵:) |
|