C#学习笔记--Attribute

直接或间接继承自System.Attribute的类是Attribute,按照约定,属性的名字应该带一个Attribute的后缀,当然不带也不会引起编译时的错误,只不过需要注意的是以下内容
None.gif using  System;
None.gif
None.gif[AttributeUsage(AttributeTargets.All)]
None.gif
None.gif
public   class  XAttribute: Attribute
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {}
None.gif
None.gif[X]                       
//  Refers to XAttribute
None.gif

ExpandedBlockStart.gifContractedBlock.gif
class  Class1  dot.gif {}
None.gif
None.gif[XAttribute]              
//  Refers to XAttribute
None.gif

ExpandedBlockStart.gifContractedBlock.gif
class  Class2  dot.gif {}
None.gif
None.gif[@X]                      
//  Error: no attribute named "X"
None.gif

ExpandedBlockStart.gifContractedBlock.gif
class  Class3  dot.gif {}
None.gif
None.gif

看过上面的代码应该知道了,@可以去掉二义性.还有一点,[ XAttribute]是没有二义性的,即使还有个属性叫做[XAttributeAttribute].
另一个内容是关于Attribute的参数的,它可以有两类参数位置参数(Positional Parameters)和命名参数(Named Parameters).见如下代码
None.gif using  System;
None.gif
None.gif[AttributeUsage(AttributeTargets.Class)]
None.gif
None.gif
public   class  HelpAttribute: Attribute
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public HelpAttribute(string url) dot.gif{    // Positional parameter
InBlock.gif

InBlock.gif        dot.gif
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public string Topic dot.gif{                 // Named parameter
InBlock.gif

ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gif{dot.gif}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{dot.gif}
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public string Url dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gif{dot.gif}
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif

每一个共有的实例(不是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则显示为编译错误)

转载于:https://www.cnblogs.com/Farseer1215/archive/2005/11/25/284632.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值