C# 中的特性
系统内置的特性
1、Obsolete : 废弃的 可以使用Obsolete特性将程序结构标注为过期的,并且在代码编译时,显示有用的警告信息
提示开发者 某方法是弃用的
使用方法:[Obsolete("这里写一些提示内容", true)] 这里的第二个参数设置为true 表示 是否把该方法标记为错误 一般情况下 false就行 显示警告
该特性可以很好的让别的程序员转到新的方法来
2、Conditional:特性允许我们设定一个条件包括或取消特定方法的所有调用
#define DoTrace // 定义宏 不需要; class Program { [Conditional("DoTrace")] static void TraceMessage(string str) { // do something } }
以上方法 在定义了 #define DoTrace这个代码的时候 TraceMessage 才会被调用 否则不会被调用
利用该特性 可以很好的做调试: 把不想调用的方法 用一个特性给声明一下
以上哪怕是不调用 依然会被当成元数据放到程序集中 一样会占用内存
3、调用者信息特性 CallerFilePath, CallerLineNumber 、CallerMemberName
这3个特性只能用于方法中的可选参数
public static void PrintOut(string message,[CallerFilePath] string fileName='', [CallerLineNumber]int lineNumber = 0, [CallerMemberName] string methodName = '') { Console.WriteLine(message); Console.WriteLine(fileName); Console.WriteLine(lineNumber); Console.WriteLine(methodName); }
4、DebuggerStepThrough 特性 (想要跳过这个方法 可以在方法上面加这个特性)
[DebuggerStepThrough] // 可以跳过debugger的单步调试 不让进入方法(当我们确定这个方法没有任何错误的时候, 可以使用这个) public void Print() { }
5、.NET 预定义了很多特性 有空可以研读
6、自定义特性
- 新建一个自定义特性类 一般以Attribute结尾
- 需要继承自 System.Attribute
- 一般情况下声明为 sealed 这样这个类就不会被继承了
- 一般情况下 特性类用来表示目标结构的一些状态(定义一些字段或者属性,一般不定义方法)
- 在类上面添加[AttributeUsage(AttributeTargets.Class)] 表示该特性只能应用在类的程序结构上
- 当使用特性的时候 编译器会自动把 Attribute后缀去掉
[AttributeUsage] 是特性 AttributeTargets 是枚举类型
namespace _015_特性 { //1, 特性类的后缀以Attribute结尾 //2, 需要继承自System.Attribute //3, 一般情况下声明为 sealed //4, 一般情况下 特性类用来表示目标结构的一些状态(定义一些字段或者属性, 一般不定义方法) [AttributeUsage(AttributeTargets.Class)]//表示该特性类可以应用到的程序结构有哪些 sealed class MyTestAttribute : System.Attribute { public string Description { get; set; } public string VersionNumber { get; set; } public int ID { get; set; } public MyTestAttribute(string des) { this.Description = des; } } }
//通过制定属性的名字,给属性赋值,这种是命名参数 [MyTest("简单的特性类",ID = 100)]//当我们使用特性的时候,后面的Attribute不需要写
如何使用自定义类 通过反射获取自定义特性集 返回一个 object[] array 通过索引获得对象 即可进行相应的操作了
Type type = typeof (Program);//通过typeof+类名也可以获取type对象 object[] array = type.GetCustomAttributes(false); MyTestAttribute mytest = array[0] as MyTestAttribute; Console.WriteLine(mytest.Description); Console.WriteLine(mytest.ID); Console.ReadKey();
浙公网安备 33010602011771号