由于很久没有写关于基础知识的东西了,今天来总结一下关于.NET平台中的代码属性的概念;只是基础介绍,文章的本意是带领初学者学会使用特性,而不是讨论高深的底层技术;[王清培版权所有,转载请给出署名]

1.什么叫特性Attribute

特性对一般.NET编程人员来说并不陌生,自从我们开始接触C#语言的时候,我们多多少少已经接触了关于特性的使用;但是对于初学者来说真的不明白特性的意义,特性到底是属于类还是类实例,这些概念搞不清楚对理解代码的逻辑真的很顺利;这篇文章我将带您来了解特性的作用,其实特性的真的很方便;至少我认为自从我懂特性之后,我的代码便的更加的人性化,程序的结构清晰易懂,所以本人在写代码的时候经常喜欢用一些能够简单明了的表达对象的特点的风格;

其实特性Attribute就是一段代码属性,附加在我们定义的对象上的,特性属于对象而不是实例,这个概念要注意;为什么需要特性,我想任何一个开发人员都不需要问为什么,因为它的好处我们是拍手叫绝的,好东西为什么不要呢;之所以你没感觉到是因为朋友你还没发现他的优点;我们还是拿代码例子来讲吧,这样便于我们双向交流;

2.实例代码学习

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace AttributeTest
  5. {
  6. [TableName(Name = "Tb_UserName")]
  7. public class M_UserName
  8. {
  9. }
  10. }

这段代码里,我有一个M_UserName类,在类的上面我加了一个TableName的特性,这个特性是用来标识我这个类对应着数据库表的名称,这样的应用一般都会在ORM中出现;TableName是我们自己定义的一个特性,这样的特性不能影响系统的编译行为,而系统的特性会改变代码的编译行为,这样的编译控制是有必要的,比如我们在进行.NET安全编程的时候,经常会用到SecurityPermissionAttribute特性控制代码的安全执行逻辑,操作系统的API最重要的一个作用就是权限控制,以免大家一起进入内核;如果不用特性进行标记,那么所有的方法都会被统一编译无法控制;[王清培版权所有,转载请给出署名]

我们回到TableName特性,特性是一中特殊的类型,这个类型继承自Attribute对象;

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace AttributeTest
  5. {
  6. /// <summary>
  7. /// 数据库表的名称
  8. /// </summary>
  9. [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
  10. public class TableName : Attribute
  11. {
  12. /// <summary>
  13. /// 名称
  14. /// </summary>
  15. public string Name { get; set; }
  16. }
  17. }

我们定义的特性还需要用系统的AttributeUsage特性进行标记,系统好将我们自己定义的特性当成特殊的类型处理;在此穿插一句,特性也是属于类类型,只不过是一种特殊的类型,这中类型是需要我们用系统特性进行说明的,这样系统在编译的时候才会将我们的特性进行元数据的区分,我们通过反射就可以把这个特殊的元数据拿到;

也许你会问,我这样标记了一个类的特性有什么用呢,当然有用,我们下面通过反射来进行动态读取对象的特性;特性属于类类型也就是属于Type,我们是通过类型获取而不是实例获取特性;

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Reflection;
  5. namespace AttributeTest
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. Type type = typeof(M_UserName);//通过typeof方法获取Type对象
  12. object[] obj = type.GetCustomAttributes(typeof(TableName), false);//通过Type对象获取指定特性
  13. TableName name = obj[0] as TableName;
  14. Console.WriteLine(name.Name);
  15. Console.ReadLine();
  16. }
  17. }
  18. }

这样我们就拿到了特性所标记的值,其实你可以把特性当成是一种静态类,当我们获取特性的时候,系统会将特性类进行加载到内存中,我不知道特性类的数据在内存中的布局是什么样的,但是对我们刚开始学习使用的时候,可以这么先理解;

总结:特性是一段代码属性,是一种特殊的类,在编译的时候以特殊的身份存在于元数据中,当我们获取它的时候,系统加载到内存中。特性属于类,不属于类实例;[王清培版权所有,转载请给出署名]

.NET简谈特性(代码属性)相关推荐

  1. .NET简谈组件程序设计之(手动同步)

    在上一篇文章".NET简谈组件程序设计之(上下文与同步域) "中,我们学习了关于一些上下文和同步域的概念,可以利用这两个技术来进行自动同步. 今天我们主要学习怎么手动来执行同步,能 ...

  2. 异步复位同步释放_简谈同步复位和异步复位

    简谈同步复位和异步复位 大侠们,江湖偌大,有缘相见,欢迎一叙,今天来聊一聊数字电路设计中的同步复位和异步复位. 谈到同步复位和异步复位,那咱们就不得不来聊一聊复位这个词了.在数字逻辑电路设计中,电路通 ...

  3. python nonlocal的用法_简谈Python3关键字nonlocal使用场景

    下面是之前提过的有待提升效率的计算移动平均的方法: def make_averager(): series = [] def averager(new_value): series.append(ne ...

  4. .NET简谈组件程序设计之(上下文与同步域)

    我们继续学习.NET多线程技术,这篇文章的内容可能有点复杂.在打破常理之后,换一种新的思考模型最为头疼.这篇文章里面会涉及到一些不太常见的概念,比如:上下文.同步域等等.我也是最近才接触这些关于组件编 ...

  5. .NET简谈事务、分布式事务处理

    在本人的 " .NET简谈事务本质论"一文中我们从整体上了解了事务模型,在我们脑子里能有一个全局的事务处理结构,消除对数据库事务的依赖理解,重新认识事务编程模型. 今天这篇文章我们 ...

  6. .NET简谈组件程序设计之(渗入序列化过程)

    在本人的上一篇文章".NET简谈组件程序设计之(初识序列化.持久化) "中,我们基本上了解了什么叫序列化和持久化.通过系统为我们提供的服务,我们可以很方便的进行二进制序列化.SOA ...

  7. 【JAVA】Object类的方法简谈

    Object类的方法简谈 Java中所有的类都继承自Object类,那我们今天来探讨一下Object类中的方法 PS:Object源码中,作者那一栏中,出现了这个 package java.lang; ...

  8. python特性和属性的区别_什么是属性,什么是特性,有何不同?

    1.特质,特征,性质(appanage●attribute●attribution) 2.计算机用语: 用于文件,指出文件是否为只读.隐藏.准备存档(备份).压缩或加密,以及是否应索引文件内容以便加速 ...

  9. [你必须知道的.NET] 第三回:历史纠葛:特性和属性

    本文将介绍以下内容: • 定制特性的基本概念和用法 • 属性与特性的区别比较 • 反射的简单介绍 1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间来了解本文的内容 ...

  10. .NET简谈自定义事务资源管理器

    在上一篇文章"NET简谈事务.分布式事务处理"中我大概总结了关于.NET中的事务处理方式和结合了WCF框架的简单应用.在事务性操作中我们的重点是能将数据进行可逆化,说白了就是能保证 ...

最新文章

  1. 框架源码系列四:手写Spring-配置(为什么要提供配置的方法、选择什么样的配置方式、配置方式的工作过程是怎样的、分步骤一个一个的去分析和设计)...
  2. Remoting技术简介
  3. mongdb学习笔记
  4. 告诉我们您想要什么,我们将做到:消费者驱动的合同测试消息传递
  5. 01-复杂度2 Maximum Subsequence Sum (25 分)
  6. yii2.0AR两表联查
  7. Kafka消费者组内各消费者分区分配
  8. 超人气光棍节!现在时间虽然不是2011年11月11日11点11分11秒11毫秒11微秒11纳秒11皮秒11飞秒11阿秒11渺秒11......
  9. java 筛选地区语句_Java选择语句
  10. websocket handshake unexpected response code 404问题
  11. 三种常见的图像处理双三次插值算法
  12. 图的应用之--图的连通
  13. 303.区域和检索-数组不可变
  14. 敏感词过滤-DFA算法
  15. 二极管工作原理及应用
  16. 【qq机器人】机器人发美女图片
  17. Java8 stream新定义运算
  18. Windows 7个性化配置,关闭Win7动画效果,设置窗口背景为“ 豆绿色”,移动“我的文档”...
  19. 深度学习(三)——深层神经网络
  20. 志强:经过测试有效的四种引流方法

热门文章

  1. Ancient Knight(打造Windows Mobile平台最专业的游戏修改器)
  2. AES、DES加解密方法(Java和JS编程)
  3. PHP伪造referer突破网盘禁止外链(附115源码)
  4. 第三十 访问财富进退自如 —Spring交易管理
  5. C#串口编程测试收发
  6. 从客户端(content=span class=Apple-s...)中检测到有潜在危险的 Request.Form 值。
  7. maven jetty的eclipse 插件
  8. k8s数据持久化实验
  9. Diagnostics: File file:/tmp/spark-***/__spark_libs__***.zip does not exist
  10. javascript -- 变量