`

学习C#:Attribute与Property

    博客分类:
  • C#
阅读更多

一.什么是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; }  

 

 

 

 

  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.     }  

 

 

 

 

 

 

 

 

 

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

 

 

四.参考资料

【1】Msdn

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

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

 

 

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

 

【2】AttributeTargets目标包括:

 

2.Attribute:

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

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

 

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

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

2.这里有一个约定:所有自定义的特性名称都应该有个Attribute后缀。当编译器看到一个属性被附加到一个程序元素上时,它会搜索具有指定属性名的System.Attribute派生类。如果编译器没有找到匹配的类,它就在指定的属性名后面加上Attribute,然后再进行搜索。因此,常见的使用做法是将属性类名定义为以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.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.     }  

示例完毕!上面三段代码相信已经说明了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. }  

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

2.使用自定义Attribute的Class:

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

总结:

  Attribute是指为类附加的说明信息,与注释不同,这些说明信息是给机器看的,并能影响机器的执行,具体应用如下:  
  1.影响编译器,相当于条件编译  
  2.调用API函数时,要用Attribute申明是.Net   Framework之外的函数  
  3.自定义Attribute,用于描述对应类或方法,也就是传说中.net是自我描述的功能  
  4.还是对机器说明这个类有什么用的,机器看到后就会采取相应的动作,  
  如[seriablae],[webservice],[TestFixture]

  • 大小: 81.8 KB
  • 大小: 49.8 KB
分享到:
评论

相关推荐

    Property和Attribute的区别

    Property和Attribute的区别

    C#中Property和Attribute的区别实例详解

    本文实例分析了C#中Property和Attribute的区别。分享给大家供大家参考。具体分析如下: 在C#中有两个属性,分别为Property和Attribute,两个的中文意思都有特性、属性之间,但是用法上却不一样,为了区别,本文暂把...

    C#程序设计-3期(KC008) KC008110100015-C#中property与attribute的区别,他们各有什么用

    C#程序设计-3期(KC008) KC008110100015-C#中property与attribute的区别,他们各有什么用处,这种机制的好处在哪里.docx 学习资料 复习资料 教学资源

    C#基础学习系列之Attribute和反射详解

    本文主要给大家介绍了关于C#基础之Attribute和反射的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 Attribute(特性) Attribute是C#的一种语言特性,用于为各种实体(class,field,...

    C#属性(Attribute)用法实例解析

    程序集,模块,类型(类,结构,枚举,接口,委托),字段,方法(含构造),方法,参数,方法返回值,属性(property),Attribute [AttributeUsage(AttributeTargets.All)] public class TestAttribute : ...

    Propergrid.rar_PropertyGrid C#_c# propertygrid_properGrid_proper

    利用微软的propertygrid快捷的实现基于attribute的开发。

    C#实现根据实体类自动创建数据库表

    .Net新手通常容易把属性(Property)跟特性(Attribute)搞混,其实这是两种不同的东西 属性指的类中封装的数据字段;而特性是对类、字段、方法和属性等元素标注的声明性信息 如下代码(Id、Name为User的属性,[Db...

    c# 自定义特性

    public class JWAttribute : Attribute { public string param1 { get; set; } public string param2 { get; set; } public string paramDefault = "paramDefault"; } [JW(param1 = "JW-A")] public class A { ...

    C# 经典著作 (详细说明)从入门到精通

    这种组件的关键在于,它们通过属性 (property)、方法 (method) 和事件 (event) 来提供编程模型;它们具有提供了关于组件的声明性信息的属性 (attribute);同时,它们还编入了自己的文档。C# 提供的语言构造直接支持...

    .net中Attribute、TypeConverter、UITypeEditor的自定义--.net自定义控件属性特性配置及相关类的设计

    3、例子中实现了一个自定义的Attribute:DisplayNameAttribute和一个自定一个TypeConverter:EnumConverter,以支持显示的值与实际选中的值可以不同并一一对应。 注意,各个属性均是自己定义的一个枚举类型...

    C# Language Specification 3.0

    这种组件的关键在于,它们通过属性 (property)、方法 (method) 和事件 (event) 来提供编程模型;它们具有提供了关于组件的声明性信息的属性 (attribute);同时,它们还编入了自己的文档。C# 提供的语言构造直接支持...

    C# 语言规范3.0

    这种组件的关键在于,它们通过属性 (property)、方法 (method) 和事件 (event) 来提供编程模型;它们具有提供了关于组件的声明性信息的属性 (attribute);同时,它们还编入了自己的文档。C# 提供的语言构造直接支持...

    C# 语言规范 v3.0

    (property)、方法 (method) 和事件 (event) 来提供编程模型;它们具有提供了关于组件的声明性信息的属 性 (attribute);同时,它们还编入了自己的文档。C# 提供的语言构造直接支持这些概念,这使得 C# 语言自然而然...

    Professional C# 3rd Edition

    Custom Attribute Example: WhatsNewAttributes 262 Reflection 265 The System.Type Class 266 The TypeView Example 268 The Assembly Class 271 Completing the WhatsNewAttributes Sample 272 Summary 276 ...

    C#代码规范 常用的代码编写规则

    C# 代码规范中列举了c#编程中所涉及的所以代码编写规范 第一章 概述 4 规范制定原则 4 术语定义 4 Pascal 大小写 4 Camel 大小写 4 文件命名组织 4 1.3.1文件命名 4 1.3.2文件注释 4 第二章 代码外观 6 2.1 列宽 6 ...

    C#3_0参考手册 doc

    这种组件的关键在于,它们通过属性 (property)、方法 (method) 和事件 (event) 来提供编程模型;它们具有提供了关于组件的声明性信息的属性 (attribute);同时,它们还编入了自己的文档。C# 提供的语言构造直接支持...

    CLR via C# 中文版 第三版(高清_全_part1.rar)

     第三部分,基本类型(Essential Types),包括字符、字符串及文本的处理,枚举类型,数组,委托(Delegate),自定义属性(Attribute),可控制类型等。    第四部分,核心设施(Core Facilities),包括异常...

    DOTNET-C#基础快速入门教程-全网最简单

    DOTNET_C#基础快速入门教程,100多页的pdf文档,包括了常用的基础知识点: 数据类型 类型转换 变量、常量、运算符 字符串 流程控制 数组 结构、枚举 访问修饰符 方法 装箱和拆箱 接口 类和对象 多态 C# 预处理器 ...

    CLR via C# 中文版 第三版(高清_全_part2.rar)

     第三部分,基本类型(Essential Types),包括字符、字符串及文本的处理,枚举类型,数组,委托(Delegate),自定义属性(Attribute),可控制类型等。    第四部分,核心设施(Core Facilities),包括异常...

Global site tag (gtag.js) - Google Analytics