学习C#:Attribute与Property

开发 后端
本文介绍了什么是Attribute,Attribute的概念定义,Attribute与Property的区别。

一.什么是Attribute

先看下面的三段代码:

1.自定义Attribute类:VersionAttribute

  1. [AttributeUsage(AttributeTargets.Class)]  
  2. public class VersionAttribute : Attribute  
  3. {  
  4.     public string Name { getset; }  
  5.     public string Date { getset; }  
  6.     public string Describtion { getset; }  

2.使用自定义Attribute的Class:

  1. [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]  
  2. public class MyCode  
  3. {  
  4.     //...  

3.上面这个Class中的Attribute一般会被如何使用呢?

  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         var info = typeof(MyCode);  
  6.         var classAttribute = (VersionAttribute)Attribute.GetCustomAttribute(info, typeof(VersionAttribute));  
  7.         Console.WriteLine(classAttribute.Name);  
  8.         Console.WriteLine(classAttribute.Date);  
  9.         Console.WriteLine(classAttribute.Describtion);  
  10.     }  

示例完毕!上面三段代码相信已经说明了Attribute大概是一个什么东西和怎么去用。

二.深入讨论Attribute

1.Attribute的概念定义

关于Attribute概念的定义,我直接引用《你必须知道的.NET之特性和属性》中的一段来说明:

MADN的定义为:公共语言运行时允许添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据(metadata)保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。

我们简单的总结为:定制特性attribute,本质上是一个类,其为目标元素提供关联附加信息,并在运行期以反射的方式来获取附加信息。

噢,原来Attribute的目的是为元素提供关联附加信息。其中,上面***段代码中“[AttributeUsage(AttributeTargets.Class)] ”说明了Attribute提供附加信息的元素是Class,所以如果上面第二段的代码改为:

  1. public class MyCode  
  2. {  
  3.     [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]  
  4.     public void Test() { }  
  5. }  
  6.  

会出现编译错误。

2.Attribute作为编译指令

Attribute类是在编译的时候被实例化的,而不是像通常的类那样在运行时候才实例化。所以在第三段代码中,你可以在没有实例化MyCode对象的情况下取到MyCode的Attribute信息。由于Attribute类是在编译的时候被实例化的,所以你还可以用外部工具维护这些Attribute信息。

3.Attribute与Property

从中文来说,Attribute和Property的中文都叫“属性”,很容易让人混淆。现在的文章,Attribute一般翻译为”特性”,而Property称为“属性”。

或许你会问,我用静态的Property/Field一样可以做到在不实例化的时候拿到一些信息,如果这样的话,Attribute又有什么存在意义呢?

1.Property:

Property可以说是一个面向对象的概念,提供了对私有字段的访问封装,在C#中以get和set访问器方法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。比如:

  1. public class Robot  
  2. {  
  3.     private string name = "";   //字段:Field  
  4.     public string Name          //属性:Property,对Field进行封装。  
  5.       {  
  6.         get { return name; }  
  7.         set { name = value; }  
  8.     }  

2.Attribute:

Attribute的目标是:为元素提供附加信息。它的作用更类似于注释。

可以说,Property/Field和Attribute是两个完全不同的概念,虽然他们有些时候能做一样的事,但请记住,他们是从本质上就不同的两个东西。

三.实现自己的Attribute时需要注意的一些问题

1.自定义的Attribute必须直接或者间接继承System.Attribute。

2.这里有一个约定:所有自定义的特性名称都应该有个Attribute后缀。因为当你的Attribute施加到一个程序的元素上的时候,编译器先查找你的Attribute的定义,如果没有找到,那么它就会查找“Attribute名称"+Attribute的定义。如果都没有找到,那么编译器就报错。这就是为什么我可以再上面***段代码中,定义一个VersionAttribute,但在第二段代码中,我使用却是Version这个Attribute。:>

下面是一些开发自定义Attribute时,可能需要用到的资料:

【1】Attribute可以关联的元素包括:

程序集(assembly)、模块(module)、类型(type)、属性(property)、事件(event)、字段(field)、方法(method)、参数(param)、返回值(return)。例如:

  1. [assembly: Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]  
  2. public class MyCode  
  3. {  
  4.     //......  

用指定的前缀来表示特性所应用的目标元素,建议这样来处理,因为显式处理可以消除可能带来的二义性。

【2】AttributeTargets目标包括:

AttributeTargets目标包括 

【3】AttributeUsageAttribute中的3个属性(Property)说明:

AttributeUsageAttribute中的3个属性(Property)说明   

四.参考资料

【1】Msdn

【2】《你必须知道的.NET之特性和属性》,博主严重推荐!

【3】《Attribute在.net编程中的应用》系列文章

【编辑推荐】

  1. C#自定义控件的开发:Pin和Connector
  2. 比较C#自定义控件的property(属性)和/attribute(性质)
  3. C#组件开发:COM和.NET对象之间的互操作
  4. 介绍.NET平台、C#和ASP.NET
  5. C# Attributes:定义设计期信息
责任编辑:book05 来源: cnblogs
相关推荐

2009-08-03 14:42:50

C#自定义控件

2009-09-11 11:16:53

C# Attribut

2024-05-20 00:00:00

C#属性Property

2015-08-10 10:58:53

dompropertyattribute

2010-12-30 09:44:10

C#Attribute

2009-08-27 16:11:03

C# delegateC# event

2024-05-17 08:42:52

AttributeMyClass方法

2009-09-11 11:33:58

C# WinForm控Attribute

2009-08-24 11:02:52

C#接口映射

2021-04-14 07:47:59

AttributeC#属性

2009-08-24 09:55:26

C#接口转换

2024-06-20 09:58:19

C#Attribute元数据机制

2009-08-20 15:02:57

C# If语句

2009-08-19 17:11:49

C#程序集

2009-08-24 10:31:37

C#接口继承

2009-08-12 15:50:40

C# ListBox

2009-08-12 09:28:36

C# WiteOne

2009-09-11 10:44:55

C#语言

2009-08-13 18:21:52

C#学习笔记

2009-08-20 17:49:53

学习C#程序
点赞
收藏

51CTO技术栈公众号