|
| |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
属性和元数据 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浏览元数据,就会发现属性确实是存在的。 返回类别: 教程 上一教程: .NET的精华一(开拓者必看) 下一教程: 十天学会ASP.net(5) 您可以阅读与"属性和元数据 -- zt"相关的教程: · 列出asp+中所有request 的属性和数值 · C#中数据库操作 · 使用COBOL.net访问数据库 · asp+中是如何连接数据库ado+的 · ASP.NET 2.0轻松实现数据库应用开发 |
| 快精灵印艺坊 版权所有 |
首页 |
||