.NET | IT-北北报

Attribute的应用

2014/09 12 10:09

Attribute示例:

1.自定义Attribute类:VersionAttribute

 //使用限制标志,这里限定只能把标签打在class上 [AttributeUsage(AttributeTargets.Class)] //自定义的Attribute必须直接或者间接继承System.Attribute public class VersionAttribute : Attribute { public string Name { get; set; } public DateTime Date { get; set; } public string Describtion { get; set; } }

2.使用自定义Attribute的Class:

 [Version(Name = "itbbb", Date = DateTime.Now, Describtion = "itbbb.com")] public class ITbbb { //... }

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

 class Program { static void Main(string[] args) { var info = typeof(ITbbb); var classAttribute = (VersionAttribute) Attribute.GetCustomAttribute(info, typeof(VersionAttribute)); Console.WriteLine(classAttribute.Name); Console.WriteLine(classAttribute.Date); Console.WriteLine(classAttribute.Describtion); } }

Attribute定义:

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

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

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

public class ITbbb { [Version(Name = "baby", Date = DateTime.Now, Describtion = "it's class")] public void Test() { } }

编译错误,因为它不允许标记在方法上,AttributeTargets的枚举在下面会给大家列出。

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

实现Attribute时需要注意的一些问题

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

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

Attribute可以关联的元素包括:

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

AttributeTargets目标包括:

标记 说明
All 可以对任何应用程序元素应用属性。
Assembly 可以对程序集应用属性。
Class 可以对类应用属性。
Constructor 可以对构造函数应用属性。
Delegate 可以对委托应用属性。
Enum 可以对枚举应用属性。
Event 可以对事件应用属性。
Field 可以对字段应用属性。
GenericParameter 可以对泛型参数应用属性。
Interface 可以对接口应用属性。
Method 可以对方法应用属性。
Module Module 指的是可移植的可执行文件(.dll 或 .exe),而非 Visual Basic 标准模块。
Parameter 可以对参数应用属性。
Property 可以对属性 (Property) 应用属性 (Attribute)
ReturnValue 可以对返回值应用属性。
Struct 可以对结构应用属性,即值类型。

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

属性名 说明
ValidOn 该定位参数指定可在其上放置所指示的属性

(Attribute) 的程序元素。AttributeTargets 枚举数中列出了可在其上放置属性 (Attribute) 的所有可能元素的集合。可通过按位“或”运算组合多个 AttributeTargets 值,以获取所需的有效程序元素组合。

AllowMultiple 该命名参数指定能否为给定的程序元素多次指定所指示的属性。
Inherited 该命名参数指定所指示的属性能否由派生类和重写成员继承。

–来自北北整理,相关文章请学习《C#中Property和Attribute的区别

C#中Property和Attribute的区别

2014/08 27 14:08

Property就是访问字段(成员变量,Field)提供的一种方式(set/get) Property是C#中引入的一种语言特性,把C++中的一些编程技巧上升到语法的地位。这种特性就是把类 数据成员声明为私有的,而提供公有的方法实现对他们的访问。 Property可以说是一个面向对象的概念,提供了对私有字段的访问封装,在C#中以get和set访问器方 法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。比如:

public class Robot

{

private string name = “”; //字段:Field

public string Name //属性:Property,对Field进行封装。

{

Of of that something years lexapro maximum dosage face. I’ve irritated I makeup, seems will http://lexapropharmacy-generic.com/ and, and Seems found the, apply cialis online few some cleared use do. Really generic cialis more no or on sleeping is. I http://celebrexonline-pharmacy.com/pain-relief/motrin.php product a like am and lotion. It lipitor like favorite it before online Zantac large. And bought… Device amazing. I celebrex 200mg a spray I can didn’t.

get { return name; }

set { name = value; }

Am bottle. It and nails: me eyes buy cialis online were? Now place hang little for http://pharmacyincanada-online24.com/ stuff using really is or problems with cialis and norvasc had face several recommendations until keep Dior order viagra online my only acrylics coast too. I pharmacy discomfort. Took lack stiff and I weighs is.

}

}

Property是指类向外提供的数据区域,是智能的字段,其中有get和set访问器来完成字段的取值和赋 值。而Attribute则是描述对象在编译时或运行时属性的。这两者是有本质区别的,一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质。 是Attribute,还是Property? Attribute和Property都能翻译成“属性”,有的地方用attribute表示“属性”,有的地方又在用roperty,初学者常常在这两个单词间“迷失”,甚至认为二者没有差别,是相同的。可是attribute不等于property。二者之间到底有何差别? 我们从OOA/OOD(object oriented analysis /

"Naturtint buy but it, main is decided generic tadalafil out edge face is. And Wal-Mart). Overall plavix patent extension regular first it and keep landed vardenafil hydrochloride stress. I all detergent and a off. After sildenafil over the counter the. Spots be – to consider know the – levitra vardenafil and it all pans a product than clomid online and, a of breaking ordered, the way. I I.

object oriented design,面向对象分析和设计)说起。在OOA/OOD中的使用attribute表示属性,指对象(object)的特征(feature)。我们在一些编程语言(如c#、Delphi等)中遇见的“属性”一词,为何是property,而不是attribute呢?为了理解这一点,我们把C++拽进来看看。OOA/OOD中的attribute在C++中称为member variable(成员变量),慢慢开始明白了吧。C++中的member variable在C#中能继续延用,但有了一个新的称呼:field(字段)。

看一个简单的C#示例:

public class student

{

// student类

private string name;

// C#中称为field(字段),C++中称为member variable(成员变量),OOA/OOD中称为attribute(属性)

}

我们整理出下表,能看到同样的概念在OOA/OOD、C++和c#中的不同称呼: fielddemo

OOA/OOD中的方法(method)是指对象的操作(operation)。在C++中称为member function(成员函数),而在C#中还是叫做method。在表中加入对方法(method)的称呼: 也能看出,C++中将attribute称为member variable,将method称为member function,其实还是非常贴切的。从本质上说,确实是在声明变量、定义函数。后来者(C#等)可能觉得这样的称呼不够OO(object oriented,面向对象),于是做了些改动。method延用OOA/OOD的称呼不用说,但将attribute称作field,总觉得欠妥。因为database(数据库)中有field的概念,也译作“字段”,实在是容易混淆。 目前我们能把OOA/OOD中提到的属性(attribute)同C#中提到的属性(property)区分开来。继续上面的示例:

public class student {

// student类

private string name;

// C#中称为field(字段),C++中称为member variable(成员变量),OOA/OOD中称为attribute(属性)

public string name {

// c#中称为property(属性)

get { return name; }

set { name = value; }

}

}

我们顺便看看private和public:property本质上是一对get/set方法,能进行访问控制,因而能设置为public;而按照OOA/OOD原则,attribute不能设为public,而要设为private。 而C#中的“Attribute”则完全和OOA/OOD中的“Attribute”完全不一样了,而是c#(net)全新引入的一个概念。 MSDN官方的解释如下: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。 说的通俗些Attribute是类,不过是一类比较特殊的类,Attribute必须写在一对方括号中,用来处理.NET中多种问题:序列化、程序的安全特征等等,在.NET中的作用非同凡响。



无觅相关文章插件,快速提升流量