C# 高级(特性)

特性

        什么是特性

描述C#中一些类型数据的信息

        特性的作用

用以将元数据或声明信息于代码(程序集、类型、方法、属性等)相关联

        特性描述

特性可像程序中添加元数据(变量)
可以将一个或多个特性应用到整个程序集、模块或较小的程序元素(如类和属性) 一个程序元素可以添加多个特性
特性可以与方法和属性相同的方式接受参数 特性可以接受参数
程序可以使用反射检查自己的元数据或其他程序内的元数据
特性(元数据)是在编译之后就定义好的

        元数据

元数据(Meta Data) 元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件(PE)文件或存储在内存中的程序进行描述。将您的代码编译为PE文件时,便会将元数据插入到该文件的一部分中,而将代码转换为 Microsoft 中间语言(MSIL)并将其插入到该文件的另一部分中。在模块或程序集中定义和引用的每个类型和成员都将在元数据中进行说明。当执行代码时,运行库将元数据加载到内存中,并引用它来发现有关代码的类、成员、继承等信息。

        特性分类

                预定义特性(.NET)

                        AttributeUsage

AttributeUsage

预定义特性AttributeUsage 主要用于标示自定义特性可以应用到哪些类型的程序元素上,这个信息由第一个参数给出。

[AttributeUsage(

        validon,//规定特性可被放置的语言元素,它是枚举器 AttributeTargets 的值的组合,默认是AttributeTargets.All.

        AllowMultiple=allowmultiple,//如果为 true,则该特性可以在同一个元素多次使用,默认是false(不可多次使用).

        Inherited=inherited,//如果为true,则该特性可被派生类继承,默认值是false(不被继承)

)]

[AttributeUsage(              AttributeTargets.Class |                (类)

                                        AttributeTargets.Constructor |     (结构体)                                                                                            AttributeTargets.Field |                 (字段)

                                        AttributeTargets.Method |             (方法)

                                        AttributeTargets.Properties,      (属性)

                                        AllowMultiple = true                      (所有)

扫描二维码关注公众号,回复: 13722629 查看本文章

)]                    

                        Conditional

Conditional 这个预定义特性标记了一个条件方法,其执行依赖于它顶的预处理标识符。它会引起方法调用的条件编译,取决于指定的值,比如Debug和Trace

#define DEBUG        //定义DEBUG宏,则下面有输出,不定义则没有输出
using System;
using System.Diagnostics;
public class Myclass
{
    [Conditional("DEBUG")]
    public static void Message(string msg)
    {
         Console.WriteLine(msg);   
    }        
}

                        Obsolete

Obsolete 这个预定义特性标记了不应被使用的程序实体。它可以让你通知编辑器丢弃某个特定的目标元素。例如,当一个新方法被用在一个类中,但是您仍然想要保持类中的旧方法,您可以通过提示显示一个您应该使用新方法,而不是旧方法的消息,来把它标记为 obsolete(过时的)。

[Obsolete(string "使用该方法会提示的内容",bool error(是否禁止使用)]

static void OldMethod()

{

        Console.WriteLine("It is the old method");

}

public static void Main()

{

        OldMethod();

}

                自定义特性


自定义特性

自定义特性应派生自 System,Attribute 类

//一个自定义特性 BugFix 被赋给类及其成员

[AttributeUsage(      AttributeTargets.Class |                (类)

                                  AttributeTargets.Constructor |     (结构体)                                                                                  AttributeTargets.Field |                 (字段)

                                  AttributeTargets.Method |             (方法)

                                  AttributeTargets.Properties,      (属性)

                                  AllowMultiple = true                      (所有)

)]                   

public class Demo : System.Attribute

{

        public Demo(int bg,string dev,string d)

        {

                this.bugNo = bg;

                this.developer = dev;

                this.lastReview = d;

        }

}

[Demo(45,"Weirdoand","12/8/2012",Message = "Return type mismatch")]

Class DemoClass{}

Unity给我们提供的自定义特性

Header

System.Serializable

Range

...

猜你喜欢

转载自blog.csdn.net/qq_24977805/article/details/123205487