Farseer

导航

C#学习笔记--Attribute

直接或间接继承自System.Attribute的类是Attribute,按照约定,属性的名字应该带一个Attribute的后缀,当然不带也不会引起编译时的错误,只不过需要注意的是以下内容
using System;

[AttributeUsage(AttributeTargets.All)]

public class XAttribute: Attribute

{}

[X]                       
// Refers to XAttribute

class Class1 {}

[XAttribute]              
// Refers to XAttribute

class Class2 {}

[@X]                      
// Error: no attribute named "X"

class Class3 {}


看过上面的代码应该知道了,@可以去掉二义性.还有一点,[XAttribute]是没有二义性的,即使还有个属性叫做[XAttributeAttribute].
另一个内容是关于Attribute的参数的,它可以有两类参数位置参数(Positional Parameters)和命名参数(Named Parameters).见如下代码
using System;

[AttributeUsage(AttributeTargets.Class)]

public class HelpAttribute: Attribute

{

    
public HelpAttribute(string url) {    // Positional parameter

        

    }


    
public string Topic {                 // Named parameter

        
get {}

        
set {}

    }


    
public string Url {

        
get {}

    }


}


每一个共有的实例(不是static)构造器都可以定义一系列位置参数,而非静态的可读写字段和属性可以定义命名参数.
三个保留的属性:
1.System.AttributeUsageAttribute 用来定义属性使用的方式.被该属性修饰的类必须是直接或者间接继承自System.Attribute,否则将会有编译时错误.有一个枚举类型的位置参数AttributeTargets,表示定义的属性可以应用到什么身上.两个命名参数AllowMultiple (代表该属性是否可以多次用在统一对象上)和Inherited (表示当该属性用到基类的时候,该属性是否会自动添加到派生类上).
2.System.Diagnostics.ConditionalAttribute 用来标志一个条件方法,通过测试编译条件来决创建一个条件.是否调用被标记属性ConditionalAttribute 的方法,取决于在调用的地方(不是被调用的地方)是否有编译条件.这个属性有一个位置参数string conditionString表示条件.条件方法有如下限制:
a)条件属性只能定义在类或者结构的方法上,如果定义在接口的方法上就会有编译错误.
b)条件属性只能定义在返回类型为void的方法上.
C)条件属性不能用在用override修饰的方法上.条件属性可以应用于有virtual的方法上,并且隐含地应用于重载该方法的方法上,但不能显式地定义某个用override修饰的方法.
d)条件属性也不能应用于实现接口的方法的方法上.否则将引发编译时错误(条件成员**方法不能实现接口**方法).
3.System.Obsolete 用来表征一个类型或者一个类型的成员不再使用了.该属性有三个实例构造函数,于是有三个位置参数定位序列.其中最多的有两个参数string message(当客户端代码调用这个类型或者类型的成员时的提示信息, bool error(默认为false当代码被注释时为警告,如果为ture则显示为编译错误)

posted on 2005-11-25 17:47  佛西亚  阅读(388)  评论(0编辑  收藏  举报