特性:C#特性是指我们可以对类、以及C#程序集中的成员进行进一步的描述,比如我们写一个关于人的类Person,该类可以对人的属性以及某些行为(方法)进行描述。那么如果我们要对人类进行进一步描述呢,比如人这个类是属于动物的灵长类动物。有人会说我们可以为这个Person类去写一个灵长动物类的父类,再用人类去继承这个类去解决。但是我们要求的是仅仅是描述性的,就是对这个人类进行进一步的描述,而在实际操作中不需要去操作。这样的情况我们就可以用特性的概念去解决,特性简而言之就是程序集的特定程序元素所具有的另外的性质。
使用方法: 由方括号,中间包裹着特性名和参数列表(也可以无参)。放置在它所要应用的元素之前(类前,方法前等等)。

特性与注释区别:1.特性会影响编译器,而注释不会
2.特性是一个类,直接或间接的继承自Attribute

特性可以标识的位置

特性可以标识在:类(AttributeTargets.Class)、方法(AttributeTargets.Method)、字段(AttributeTargets.Field)

        /// <summary>/// 代表该类可以标识在类(AttributeTargets.Class)、方法(AttributeTargets.Method)、字段(AttributeTargets.Field)上/// </summary>[AttributeUsage(AttributeTargets.Class| AttributeTargets.Method| AttributeTargets.Field)]public class PersonAttri:Attribute{ }[PersonAttri]public class clas1{}[PersonAttri]public static void Ff(){}[PersonAttri]private string S = "FBDB";

Conditional条件特性

       public class MyClass{//代表只能在DEBUG模式下执行[Conditional("DEBUG")]public static void mess(string a){Console.WriteLine(a);}}class Test{public static void Function1(){MyClass.mess("in Function1 ");Function2();}public static void Function2(){MyClass.mess("in Function2 ");}}static void Main(string[] args){Console.WriteLine("=====>Conditional特性测试");MyClass.mess("In MyClass");Test.Function1();}

运行结果展示
debug 模式下:

release模式下:

Obsolete 特性

一个程序可能在其生命周期中经历多次发布,而且很可能延续多年。在程序生命周期的后半部分,程序员经常需要编写类似功能的新方法替换老方法。处于多种原因,你可能不再使用哪些调用过时的旧方法的老代码。而只想用新编写的代码调用新方法。旧的方法不能删除,因为有些旧代码也使用的旧方法,那么如何提示程序员使用新代码呢?可以使用Obsolete特性将程序结构标注为过期的,并且在代码编译时,显示有用的警告信息。

      [Obsolete("该方法已过时")]public static void OTest(){Console.WriteLine("我是Obsolete特性");}/// <summary>/// 当error为true时,该方法编译不了/// </summary>[Obsolete(message: "该方法已过时",error: true)]public static void OTest1(){Console.WriteLine("我是Obsolete特性");}static void Main(string[] args){  Console.WriteLine("=====>Obsolete特性测试");OTest();//出现警告,仍然可以编译OTest1();//出现错误,无法编译}


Seriallizeable特性

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

[Serializable]//代表该类可以被序列化public class Student{public int id { get; set; }}

自定义特性

自定义特性类继承自Attribute抽象类
1.AttributeUsage默认可以标注所有(类、方法、字段[AttributeUsage(AttributeTargets.All)]),也可以进行指定: AttributeTargets.Method| AttributeTargets.Property,多个用|符号进行指定;
2.AllowMultiple =true表示可以在同一类或方法等上面进行多次标识
3.Inherited=true代表被继承的类可以继承该特性类的属性
4.AttributeTargets.ReturnValue| AttributeTargets.Parameter代表特性可以修饰返回值和参数

 [AttributeUsage(AttributeTargets.Method| AttributeTargets.Property| AttributeTargets.Class| AttributeTargets.ReturnValue| AttributeTargets.Parameter,AllowMultiple = true,  Inherited =true)]public class CustomAttribute : Attribute{public CustomAttribute(){ }public CustomAttribute(string a){Console.WriteLine($"这是string参数{a}");}public CustomAttribute(int a){Console.WriteLine($"这是int参数{a}");}}//[CustomAttribute] 或[CustomAttribute()]public class Person{[CustomAttribute][CustomAttribute(89)]public int id { get; set; }[CustomAttribute("这是name")]public string name { get; set; }//[CustomAttribute("这是方法")][return: CustomAttribute]public static void Test([CustomAttribute]string msg){ }}

特性中Inherited属性详解

 [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,Inherited =true)]public class ScopeAttribute : Attribute{public ScopeAttribute(){}}[Scope]public class StudentInher{}/// <summary>/// Inherited=true 代表标记类被继承,那么特性也会继承过去/// </summary>public class NewStudentInher: StudentInher{ }public static void TestInhretied(){Type type = typeof(NewStudentInher);if (type.IsDefined(typeof(ScopeAttribute), true)){Console.WriteLine("NewStudentInher上面存在ScopeAttribute特性");}else{Console.WriteLine("NewStudentInher上面不存在ScopeAttribute特性");}}static void Main(string[] args){           Console.WriteLine("=====>基于特性的Inherited应用测试");TestInhretied();Console.ReadKey();}

特性使用举例

    /// <summary>/// 定义放到字段上面的特性/// </summary>[AttributeUsage(AttributeTargets.Field)]public class RemarkAttribute : Attribute{public int Id { get; set; }public string Describe { get; private set; }public RemarkAttribute(string des,int id){Describe = des;Id = id;}public RemarkAttribute(string des){Describe = des;             }}/// <summary>/// 扩展方法:针对已有类进行方法扩展/// 步骤:1.必须是静态类/// 2.定义的方法第一个参数前面是this 扩展类名称 参数名称/// </summary>public  class AttributeExtend{public static string GetDescribeInfor(Enum value){//获取枚举type类型Type type = value.GetType();FieldInfo filed = type.GetField(value.ToString());if (filed.IsDefined(typeof(RemarkAttribute), true)){var attribute = (RemarkAttribute)filed.GetCustomAttribute(typeof(RemarkAttribute), true);return $"id={attribute.Id},describe={attribute.Describe}";}else{return value.ToString();}}}/// <summary>/// 用户枚举/// </summary>public enum PersonState{[RemarkAttribute("正常状态", 1001)]Normal,[RemarkAttribute("冻结状态",1002)]Frozen,[RemarkAttribute("删除状态",1003)]Delete,}//测试static void Main(string[] args){ Console.WriteLine("=====>基于枚举扩展方法与特性应用测试");PersonState personState = PersonState.Delete;var result = AttributeExtend.GetDescribeInfor(personState);Console.WriteLine(result);            Console.ReadKey();}

参考文章1:https://blog.csdn.net/qq_38507850/article/details/79181319
参考文章2:https://blog.csdn.net/lym940928/article/details/80550416

C#基础知识学习——特性(Conditional特性、Obsolete特性、自定义特性)(十六)相关推荐

  1. 基础知识学习---牛客网C++面试宝典(五)C/C++基础之新特性

    1.本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习: 暂时只有2023年3月份,第一次社招找工作的过程: 2.个人经历: 研究生期间课题是SLAM在无 ...

  2. 2021-7-19-OpenStack基础知识学习

    OpenStack基础知识学习 参考文献:Wolf_Coder,百度百科 1,云计算 1.1,出现原因 由亚马逊公司提出.1.随着业务增加公司内部的服务器不够使用,进行虚拟化技术->2.随着公司 ...

  3. 网络基础知识学习笔记

    网络基础知识学习笔记 参考菜鸟教程.个人学习整理,仅供参考.三年前学过,三年没用忘了,重新学习整理一下. 文章目录 网络基础知识学习笔记 OSI七层网络模型 IP地址 子网掩码及网络划分 网络协议 A ...

  4. python基础知识学习总结

    python基础知识学习总结 从零开始学习python,已经学习完python相关的基础教程,学习地址详见:http://www.runoob.com/python/python-tutorial.h ...

  5. 计算机二级二叉树基础知识,2017年计算机二级公共基础知识学习教程:树与二叉树...

    (六)树与二叉树 1.树的基本概念 树是一种简单的非线性结构.在树结构中,数据元素之间有着明显的层次结构.在树的图形表示中,用直线连接两端的结点,上端点为前件,下端点为后件. 在树结构中,每一个结点只 ...

  6. Python 基础知识学习笔记——NumPy

    Python基础知识学习笔记--NumPy 与 matlab 优秀的矩阵运算类似,python 提供了 numpy 库,这对熟悉 matlab 的用户来说非常友好.向量.矩阵和多维数组是数值计算中必不 ...

  7. Python 基础知识学习笔记——OpenCV(1)

    Python 基础知识学习笔记--OpenCV(1) OpenCV是一个开源的跨平台计算机视觉和机器学习软件库,它轻量而且高效,被广泛的使用. 整理一下OpenCV学习笔记,以防忘记. 文章目录 Py ...

  8. Python基础知识学习笔记——Matplotlib绘图

    Python基础知识学习笔记--Matplotlib绘图 整理python笔记,以防忘记 文章目录 Python基础知识学习笔记--Matplotlib绘图 一.绘图和可视化 1.导入模块 2.一个简 ...

  9. python基础知识学习笔记(2)

    python基础知识学习笔记(2) 整理一下python基础知识,以防忘记 文章目录 python基础知识学习笔记(2) python简洁的一行代码 python简洁的一行代码 1.交换两个变量 # ...

  10. python基础知识学习笔记(1)

    python 基础知识学习笔记(1) 总结一下Python基础知识,以防忘记. 文章目录 python 基础知识学习笔记(1) 一.起步 1.python安装与编译环境 二.变量和简单数据类型 三.列 ...

最新文章

  1. android 按键kl文件,Android添加新按键
  2. NYOJ 692 Chinese checkers(广搜)
  3. SPOJ - QTREE2 Query on a tree II(LCA)
  4. junit单元测试断言_简而言之,JUnit:单元测试断言
  5. 系统优化-----sysctl.conf文件内核设置参数详解
  6. uniapp增加百度统计代码(h5)
  7. docker copy异常
  8. box-shadow
  9. java向kafka推送数据_Java编写程序将数据存入Kafka中
  10. Sqlserver2012 评估期已过解决问题
  11. matlb:图像的几何矩,中心矩,Hu不变矩(含代码)
  12. Unix环境高级编程代码(实时更新)
  13. volatility内存取证
  14. PS快捷键大全 打开置入 图层操作的快捷键 新建图层 填充上色 前景色背景色等的快捷键
  15. OneNote使用技巧 - 2.将网页内容保存到OneNote中
  16. 使用Vue解决跨域问题
  17. 机器学习:k-means聚类效果评估
  18. 软件工程实践2017——软件产品案例分析
  19. Jboss RichFaces + Skin的简单运用示例代码
  20. 贸易大时代:代理IP助力企业出海

热门文章

  1. 菜鸟小超超开发小记(一)
  2. Flood fill algorithm
  3. python生成简单名片二维码(不带图片)
  4. 根据指令判断寄存器状态
  5. 一套用了 70 年的计算机架构 —— 冯·诺依曼架构
  6. Task 4: Contextual Word Embeddings
  7. 计算机维护培训宁夏,西夏区广播电视大学计算机系统与维护专业_宁夏报名_网络教育计算机系统与维护专业教学计划_中国教育在线...
  8. Fluent UDF中直接调用math.h中的误差函数erf、erfc
  9. 场效应管微变等效电路的计算_微变等效电路如图.ppt
  10. 【buildroot】buildroot使用总结