业务应该这么写--特性

       特性真的好常见,用到地方也挺多的。程序员

       在我平时工做中,看得比较多的特性有Web端:权限控制Authorize,过滤器,序列化,WCF,Webservice里面也有不少,WebMethod,DataContract,还有作桌面端的用得最多的DllImport(能够直接和Win32程序进行通讯),还有咱们经常使用到ORM,特性真的是无所不能,好像高逼格的地方,特性老是要来搞事。下面让咱们一块儿来看看特性到底是怎么样进行工做的。编程

   (一)特性出现的背景和初衷是什么,用来解决什么问题

           特性:给类,方法等提供附加的功能,加强了软件系统的灵活性,促进了功能的松散耦合。缓存

           用特性呢,能够避免多个相似的代码段,建立更为可读和清晰的代码。若是咱们能够用.Net自带的特性,咱们应该积极的用。函数

   若是不能的话呢,咱们就能够本身定义一个特性类。特性属于声明式编程的一种。性能

   (二)特性的好处和坏处,带来的挑战是什么

          特性的好处:在不破坏类型封装的前提下,增长一点额外的信息和功能。更加灵活了。就是能够把业务和非业务逻辑区分得更开。spa

          特性的坏处:定义。应用和反射特性能带来许多便利。因此不少开发人员都喜欢用这些技术。而特性是存在元数据里面的,可能会对性能有一些影响。由于要用反射的话,内部都必须扫描托管模块的元数据,执行字符串比较来定位到指定的特性类。这样操做是会耗费必定时间的。设计

假如对性能要求比较高的话,能够缓存这些结果。code

 (三)适用场景  

          一、业务场景blog

         咱们平时不少公共逻辑,好比须要登陆才能够进行受权。定义枚举的时候,要带上描述信息。ORM里面的表名,列名映射关系。等等,还有不少地方,欢迎你们补充。继承

   (四)特性的组成部分和关键点

           4/1 特性的基本组成

           

           从上图能够知道,特性是属于元数据里面的内容的,咱们也能够经过反编译来看看一下就能够明白了。

           一、以下例子:

  class Program
    {
        [Text()]
        static void Main(string[] args)
        {
            Console.WriteLine("test");
        }
    }

    public class TextAttribute : Attribute
    {
        
    }

        咱们直接来看反编译这段程序以后的IL;

        

           从上面能够看出,特性就是存在咱们元数据中的,并且还会去调用这个特性类的构造函数。

           4/2 特性的基础知识点

           一、特性类,都必需要继承自Attribute。这是由于面向CLR的全部编译器都必须识别Attribute,而且最终能在元数据中生成特性信息。

           编译器有点傻的就是无论这个特性有没有用,都会生成对应的元数据。

            二、特性能够应用于程序集,模块,类型,字段,返回值,方法,参数,属性,事件。

            三、接下来咱们思考一个问题,咱们是否是定义一个特性,而后就能够随便用呢,用在属性,方法,程序集,等等这些属性上。假如咱们不指定特性的使用范围呢,那咱们反射的时候,是否是要从方法,属性,类上面都检测一下是否含有这个特性呢,想一想这样会给咱们性能带来多大的影响呢。因此C#的设计者给咱们提供了一个 [AttributeUsage(AttributeTargets.All,AllowMultiple =true,Inherited =true)] 这个东西。

               (1)AttributeUsage是一个特性类,能够经过reflector看看它里面就明白了

                 

     咱们直接须要传三个参数的构造函数。 [AttributeUsage(AttributeTargets.All,AllowMultiple =true)]

             AttributeTargets 这是一个枚举。这个主要是用来指定特性的做用范围。做为一个程序员,咱们应该要根据须要来合理指定。

             

             Inherited: 这个是说这个特性是否要进行继承,若是要设置为true的话呢,咱们反射去检查它的派生类是否应用了这个特性。

              通常状况下,咱们不会把这个值设置为true,这样除了会额外的检查,可能还会带来混淆。因此通常建议定义特性类的时候,把它

             设定为sealed,减小混淆,避免此次检查。

             AllowMultiple:通常来讲,太多特性屡次应用于同一个目标是没有意义的。没有什么特别必要把这个值设置为true。

           4/3 特性的三部曲。

          一、定义一个类,继承自Attribute类,而且类名是以Attribute结尾的。

          二、给指定的方法,属性,类等等,给须要用特性的地方,加上特性打上标记。 

          三、经过反射来调用,使得特性生效。

          不少人的错觉,就是觉得写上特性就能够生效。全部让特性生效的地方必定是主动应用了这个特性。

    (五)特性的底层原理和关键实现

          定制特性能有效,彻底是由于元数据和反射这个东东。

    (六)已有的实现和它进行对比

         以前咱们没用特性的时候,咱们普通的作法就是,假设如今是作Webservice开发,定义一个父类(Base),里面写一些通用的方法,而后全部的asmx都继承这个父类,以后在每一个须要用的地方调用一下。

         估计还有其余作法,我以后再慢慢分享,今天实在是太累了...欢迎你们留言讨论,祝你们中秋快乐。

相关文章
相关标签/搜索