什么是特性
用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。
用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。
.Net 框架提供了两种类型的特性:预定义特性和自定义特性。
语法
名称和值是在方括号内规定的,放置在它所应用的元素(方法)之前。
positional_parameters 规定必需的信息,name_parameter 规定可选的信息。
[attribute(positional_parameters, name_parameter = value, ...)]
特性与注释区别
[Obsolete]编译时就有提示,影响了编译器[Obsolete(“请不要使用这个了,请使用什么来代替”, true)]甚至导致编译报错
Obsolete
是一个特性类,标记已过时的代码或方法,当(类,方法、属性等)标记时,意味不在推荐使用。
[Serializable]对象就可以序列化,影响了程序运行
Serializable是一个特性类,表示该类的对象可以被序列化,序列化是将对象转换为字节流的过程。
/// <summary>
/// 这里是注释,除了让人看懂这里写的是什么,对运行没有任何影响
/// </summary>
///[Obsolete("请不要使用这个了,请使用什么来代替")]//对编译都产生了影响,编译出现警告
///[Obsolete("请不要使用这个了,请使用什么来代替", true)]//对编译都产生了影响,编译报错不通过
[Serializable]//可以序列化和反序列化
特性使用
1.预定义特性
- AttributeUsage 描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型
//使用这个特性时,可以应用于类、结构体、枚举和委托。 Inherited 是false表示不允许此类被继承
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Delegate, Inherited = false)]
//可以被com可见 而com(Component Object Model)是软件组件的架构,用于实现跨平台和多语言的软件组件操作
[ComVisible(true)]
public sealed class SerializableAttribute : Attribute
{
//用于获取与指定的类型关联的自定义特性
internal static Attribute GetCustomAttribute(RuntimeType type)
{
if ((type.Attributes & TypeAttributes.Serializable) != TypeAttributes.Serializable)
{
return null;
}
return new SerializableAttribute();
}
//它用于判断指定的类型是否标记为可序列化
internal static bool IsDefined(RuntimeType type)
{
return type.IsSerializable;
}
}
- Conditional 标记了一个条件方法,其执行依赖于指定的预处理标识符
(允许我们包括或排斥特定方法的所有调用。简单的讲它可以根据条件编译来进行方法调用。)public class MyClass { //Conditional用于指定在方法调用时的条件 [Conditional("MyClass")] public void MethodA(string msg) { Console.WriteLine(msg); } public void MethodB() { Console.WriteLine("进行中"); } }
- Obsolete 标记了不应被使用的程序实体
[Obsolete("请不要使用这个了,请使用什么来代替")]//对编译都产生了影响,编译出现警告
[Obsolete("请不要使用这个了,请使用什么来代替", true)]//对编译都产生了影响,编译报错不通过
2.自定义特性
- 定义一个类并且这个类派生自
- 类的名字以Attribute后缀结构。
- 为了安全性,可以用一个sealed修饰成一个密封类型(非必须的),以防止被其他类所继承
public sealed class MyCustomAttribute : Attribute
{
public MyCustomAttribute()
{
}
public MyCustomAttribute(string name)
{
}
}