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、自定义特性

  1.   新建一个自定义特性类 一般以Attribute结尾
  2.   需要继承自 System.Attribute
  3.   一般情况下声明为  sealed  这样这个类就不会被继承了
  4.        一般情况下 特性类用来表示目标结构的一些状态(定义一些字段或者属性,一般不定义方法)
  5.        在类上面添加[AttributeUsage(AttributeTargets.Class)]  表示该特性只能应用在类的程序结构上
  6.        当使用特性的时候  编译器会自动把 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();

 

posted @ 2021-04-12 22:37  一个新星的诞生  阅读(39)  评论(0)    收藏  举报