C#学习笔记--Attribute
直接或间接继承自System.Attribute的类是Attribute,按照约定,属性的名字应该带一个Attribute的后缀,当然不带也不会引起编译时的错误,只不过需要注意的是以下内容
看过上面的代码应该知道了,@可以去掉二义性.还有一点,[XAttribute]是没有二义性的,即使还有个属性叫做[XAttributeAttribute].
另一个内容是关于Attribute的参数的,它可以有两类参数位置参数(Positional Parameters)和命名参数(Named Parameters).见如下代码
每一个共有的实例(不是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则显示为编译错误)
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 {}
[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 {}
}
}
[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则显示为编译错误)