`
guoyiqi
  • 浏览: 999051 次
社区版块
存档分类
最新评论

学习C#:Attribute与Property(转自:http://jhxk.iteye.com/blog/481730)

 
阅读更多

一.什么是Attribute

先看下面的三段代码:

1.自定义Attribute类:VersionAttribute

  1. [AttributeUsage(AttributeTargets.Class)]
  2. publicclassVersionAttribute:Attribute
  3. {
  4. publicstringName{get;set;}
  5. publicstringDate{get;set;}
  6. publicstringDescribtion{get;set;}
  7. }

  1. classProgram
  2. {
  3. staticvoidMain(string[]args)
  4. {
  5. varinfo=typeof(MyCode);
  6. varclassAttribute=(VersionAttribute)Attribute.GetCustomAttribute(info,typeof(VersionAttribute));
  7. Console.WriteLine(classAttribute.Name);
  8. Console.WriteLine(classAttribute.Date);
  9. Console.WriteLine(classAttribute.Describtion);
  10. }
  11. }

【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'sclass")]
  2. publicclassMyCode
  3. {
  4. //......
  5. }

会出现编译错误。

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. publicclassRobot
  2. {
  3. privatestringname="";//字段:Field
  4. publicstringName//属性:Property,对Field进行封装。
  5. {
  6. get{returnname;}
  7. set{name=value;}
  8. }
  9. }

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

二.深入讨论Attribute

1.Attribute的概念定义

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

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

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

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

  1. publicclassMyCode
  2. {
  3. [Version(Name="hyddd",Date="2009-07-20",Describtion="hyddd'sclass")]
  4. publicvoidTest(){}
  5. }

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

2.使用自定义Attribute的Class:

  1. [Version(Name="hyddd",Date="2009-07-20",Describtion="hyddd'sclass")]
  2. publicclassMyCode
  3. {
  4. //...
  5. }

总结:

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

分享到:
评论

相关推荐

    http://www.w3.org/TR/html4/loose.dtd

    for presentation attribute and elements is required. HTML 4 includes mechanisms for style sheets, scripting, embedding objects, improved support for right to left and mixed direction text, ...

    JSP标签,采用web.xml引入标签库描述文件

    <attribute> <name>name</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> </tag> </taglib> ``` 这里定义了一个名为`helloWorld`的标签,...

    dubbo.xsd阿里巴巴开源xsd文件

    <?xml version="1.0" encoding="UTF-8" standalone="no"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans"... <xsd:attribute name=

    dom4j解析XML文件格式

    #### 一、DOM4j概述与环境搭建 DOM4j(Document Object Model for XML)是一款Java平台上的开源XML处理库,它提供了灵活、高效且易于使用的API来处理XML数据。DOM4j支持DOM、SAX、JAXP等多种XML解析方式,并内置了...

    交通预测模型合集:STGCN、DCRNN、ASTGCN、Graph wavenet、STGNN、STSGCN、STFGNN

    注:仅学习使用哈~主要包含的模型:STGCN、DCRNN、ASTGCN、Graph wavenet、STGNN、STSGCN、STFGNN。 模型所在的文章分析链接:(注:下述链接预计在2025年发布) STGCN:...

    离散化方法:Class-Attribute Contingency Coefficient (CACC - MATLAB):CACC离散化方法的正确实现。http://cs.adelaide.edu.au/~jzaragoza-matlab开发

    这是 Tsai 等人在 2008 年发表的论文“A Discretization Algorithm Based on Class-Attribute Contingency Coefficient”中出现的离散化方法的正确 MATLAB 实现。 如果您尝试了其他一些实现,但没有收到论文中报告...

    C# 自定义属性在propertyGrid控件中显示 演示demo

    在.NET框架中,C#是一种常用的编程语言,用于构建各种应用程序。在开发用户界面时,`PropertyGrid`控件是一个非常实用的工具,它能够自动显示对象的公共属性、方法和事件,使得用户可以方便地查看和修改这些成员的值...

    FFmpeg-安装过程

    ./configure --enable-gpl --enable-nonfree --enable-libx264 --enable-libfdk-aac --enable-libmp3lame ... ``` 4. **编译**:配置完成后,执行`make`命令进行编译: ``` make ``` 5. **安装**:编译成功后...

    PX4固件源码编译中的坑

    我这里是使用的我自己的电脑,安装的...git clone https://github.com/PX4/Firmware.git cd Firmware git submodule update --init --recursive 注:若想安装指定版本的固件,使用如下方法: # 查看目前固件版本 git d

    spring自定义标签

    <xs:attribute name="attr1" type="xs:string" use="required"/> <xs:attribute name="attr2" type="xs:boolean" use="optional"/> </xs:complexType> </xs:schema> ``` 接下来,我们需要在Spring的主配置文件中...

    AAPT: error: resource attr/** (aka com.**.app:attr/**) not found.

    问题记录 记录项目中的一个问题,不知什么时候,运行项目会出现这个错误: 解决方法 buildscript { repositories { ... classpath 'com.android.tools.build:gradle:3.6.2' } } 反思 项目出现问题

    Cocos Creator模拟砸金蛋3d旋转效果 | 附代码egg.zip

    // Learn Attribute: // - [Chinese] https://docs.cocos.com/creator/manual/zh/scripting/reference/attributes.html // - [English] ...

    一个关于C# PropertyGrid增加自定义属性的范例。

    在C#编程中,`PropertyGrid`控件是一个强大的工具,用于显示和编辑对象的属性。它通常用于创建用户友好的界面,使开发者能够轻松地查看和修改对象的属性值。这个范例将向我们展示如何扩展`PropertyGrid`的功能,以...

    ASP.NET MVC5 新特性:Attribute路由使用详解

    ### ASP.NET MVC5 新特性:Attribute路由使用详解 #### 一、Attribute路由简介与启用 在探讨Attribute路由之前,我们先来明确一下它的定义。**Attribute路由**是一种新的路由机制,它允许开发者直接在控制器的方法...

    安装GreenOdoo-8.0-l打开时报错AttributeError: 'NoneType' object has no attribute 'group'

    NULL 博文链接:https://wuhuizhong.iteye.com/blog/2228085

    C#特性Attribute的实际应用之:为应用程序提供多个版本

    在.NET框架中,C#的特性(Attribute)是一种元数据,可以附加到代码的各种元素上,如类、方法、属性等,以提供额外的信息。这些信息可以在运行时被反射机制读取,从而实现各种功能。在标题“C#特性Attribute的实际...

    c#的attribute实例源码

    C#的Attribute是一种元数据,它允许我们向代码添加额外的信息,这些信息可以在编译时或运行时被程序集、编译器、反射或其他工具使用。Attribute不是代码的一部分,它们不直接影响程序的执行,但提供了方便的方式来...

    wsdl文件解析

    import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; //import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; //import org.dom4j.io.XMLWriter; //import org....

    一步步写嵌入式操作系统.zip

    编译错误2: gcc -g -O2 -o skyeye skyeye.o ./utils/libutils.a ./arch/arm/libarm.a ./device/libdev.a ./arch/mips/libmips.a ./arch/ppc/libppc.a ./arch/bfin/libbfin.a ./arch/mips/libmips.a ./arch/coldfire...

Global site tag (gtag.js) - Google Analytics