转载自:http://blog.csdn.net/wangyy130/article/details/44241173

一、什么是Attribute

Attribute 类将预定义的系统信息或用户定义的自定义信息与目标元素相关联。目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可执行文件模块、参数、属性 (Property)、返回值、结构或其他属性 (Attribute)

在这里,我们需要将Attribute和property分开

property是指类想外提供的字段,它属于面向对象层面中抽象类时,该类的一种状态描述,比如我们根据美国人的特点高鼻梁,黄头发,蓝眼睛等这些特征,来抽象出一个Americans这个类,那么这里的高鼻梁,黄头发,蓝眼睛就是American这个类的property

Attribute是在程序编译或运行时,来描述类或其它事物的某种特点的。

比如,我们在程序中声明了两个不同的方法,但是一个是原来声明的,已经过时了,那么我们就可以利用Attribute来进行标识,让它来告诉程序,这个不能使用。它属于编程语言文法上的东西。好像一种协议或规定之类的,它并不一定是某个对象所具有的属性。

二、使用

通过上面的介绍,应该对Attribute有了一个大致的概念了,我们看一下具体的应用。

它可分为两类:1、预定义:微软已经封装好的

2、自定义:需要自己定义然后使用的。为用户提供了很好的扩展

先来说一下预定义有哪些Attribute

1、Conditional

当调用标记为条件的方法时,指定的预处理符号的存在或不存在决定是否包含或省略此调用。如果定义了该符号,则包含调用;否则省略调用。使用 Conditional 是封闭#if 和 #endif 内部方法的替代方法,它更整洁、更别致、减少了出错的机会

实例:

#define yanyan //宏定义,必须在所有代码之前 
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
A.B();
A.C();
}
}
public class A { [Conditional("yanyan")]
public static void B() {
Console.WriteLine("Hello");
}
[Conditional("lixue")]
public static void C() {
Console.WriteLine("World");
} }

  

这里需要注意的是:如果没有定义任何条件的方法,那么默认只要调用就总是会执行此方法,如果你想通过条件来判断执行,那么该方法上必须至少包含一个conditional特性所定义的条件,它才会响应你定义的条件#define

定义多个条件:

逻辑或

[Conditional("yanyan"),Conditional("wyy")]

public static void B() {

Console.WriteLine("Hello");

}

逻辑与:MSDN提供了方法,但是未能实现,对其含义没能完全理解

2、Obsolete

ObsoleteAttribute适用于所有程序元素除了组件、模块、参数和返回值。将一个元素标记为过时的告知用户,该元素在该产品的未来版本将被删除。

实例:

 using System;
using System.Reflection;
public class Example
{
// Mark OldProperty As Obsolete.
[ObsoleteAttribute("This property is obsolete. Use NewProperty instead.", false)]
public static string OldProperty
{ get { return "The old property value."; } }
public static string NewProperty
{ get { return "The new property value."; } }
// Mark CallOldMethod As Obsolete.
[ObsoleteAttribute("This method is obsolete. Call CallNewMethod instead.", true)]
public static string CallOldMethod()
{
return "You have called CallOldMethod.";
}
public static string CallNewMethod()
{
return "You have called CallNewMethod.";
}
public static void Main()
{
Console.WriteLine(OldProperty);
Console.WriteLine();
Console.WriteLine(CallOldMethod());
}
}

  

注意:在这里,如果给obsolete第二个参数赋值,false代表编译时,如果调用了此方法,会提出警告,但不会把它当做错误,否则true为当成错误,不能编译成功

3、AttributeUsage

确定可以如何使用自定义特性类。 AttributeUsage 是一个可应用于自定义特性定义,以便控制如何应用新特性的特性。

此特性主要有三个参数:1、AttributeTargets:作用目标,即对这个特性生效的具体对象,可能是一个类或方法等也可以为All

2、AllowMultiple:是否允许多个实体多次使用

3、Inherited :是否允许派生于特性化的类对它进行继承

这个类既然是针对于自定义类的,那具体的应用就应该从自定义特性中去理解。

总结:以上是关于预定义特性的一些基础,主要包括三个类,Conditional,Obsolete和AttributeUsage,其中应该注意的它们使用时,各自的参数的意义,下篇博客总结有关自定义特性的一些知识和应用

Attribute预定义特性的更多相关文章

  1. PHP预定义接口之 ArrayAccess

    最近这段时间回家过年了,博客也没有更新,感觉少学习了好多东西,也错失了好多的学习机会,就像大家在春节抢红包时常说的一句话:一不留神错过了好几亿.废话少说,这篇博客给大家说说关于PHP预定义接口中常用到 ...

  2. .NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式

    开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,. ...

  3. ES5基础之正则表达式02:范围类、预定义类和边界字符

    1.范围类 //元字符 /* * 正则表达式由两种基本字符类型组成 * 1.原义文本字符:例如123abc * 2.元字符:元字符是在正则表达式中有特殊含义的非字母字符 */ //常见特殊符号:. * ...

  4. C++ 中常见预定义宏的使用

    http://blog.csdn.net/hgl868/article/details/7058906 替代字符串: #define DOWNLOAD_IMAGE_LOG /var/log/png.l ...

  5. C#中一些默认的预定义属性

    C#中一些默认的预定义属性,见下表: 预定义的属性 有效目标 说明 AttributeUsage Class 指定另一个属性类的有效使用方式 CLSCompliant 全部 指出程序元素是否与CLS兼 ...

  6. Silverlight 预定义颜色速查表

    预定义颜色      可以使用 SolidColorBrush 绘制,它使用预定义纯色.这可以是 Colors 的静态属性 (Property) 名称,也可以是指定为 XAML 属性 (Attribu ...

  7. (一)预定义宏、__func__、_Pragma、变长参数宏定义以及__VA_ARGS__

    作为第一篇,首先要说一下C++11与C99的兼容性. C++11将 对以下这些C99特性的支持 都纳入新标准中: 1) C99中的预定义宏 2) __func__预定义标识符 3) _Pragma操作 ...

  8. Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216  java c# php js.docx

    Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216  java c# php js.docx 1.1. 预定义函数 魔术方法 魔术函数是什么1 1.2. & ...

  9. WebService -- Java 实现之 CXF ( 添加系统预定义的拦截器)

    1. 概述 CXF允许我们在webservice的in/out位置添加拦截器.拦截器有两大分类,一类是系统预定义的:另一类是自定义拦截器. 2. 在server端添加拦截器. JaxWsServerF ...

随机推荐

  1. JAVA安全漫谈1-8笔记

    一.反射篇1 classloader就是java的类加载器,告诉虚拟机如何加载这个类.默认情况下根据类名来加载类,类名必须是完整路径 public class class_init { { Syste ...

  2. IDEA 重复代码快速重构(抽取重复代码快捷键)

    Ctrl+Alt+M 顺带一提,eclipse的快捷键是:Alt+Shift+M;

  3. Maven 3.6.1 下载及安装配置

    Step1:Download You can download Maven3.6.1 from maven.apche.org , or from here. Step2:Unzip and add ...

  4. UML期末复习题——2.9:UML Deployment Diagram

    附加题:部署图 重要概念: 1. 部署图 部署图表示的是,如何将具体的软件制品(例如可执行文件)分配到计算节点(具有处理服务的某种事物)上.部署图表示了软件元素在物理架构上的部署,以及物理元素之间的通 ...

  5. as 什么意思?

    You can denote particular console messages and variable values as having different types using four ...

  6. mongodb 报错 not authorized on admin to execute command【 version 3.2.18 】

    mongodb version 3.2.18 测试问题: 分析: 从报错内容上看是权限不够,但不明了为什么,因为已经使用的超级用户权限: { "_id" : "admin ...

  7. 轻量级通用上采样算子-CARAFE

    转载:https://zhuanlan.zhihu.com/p/76063768 前言 这篇论文被 ICCV 2019 接收为 oral presentation.之前我们主要研究物体检测(例如 Hy ...

  8. 用SSMS连接Azure Sql Database 与连接本地库的一些操作区别

    背景 我们知道Azure Sql Database 可以降低运维成本.是一种Pass模式,有资源弹性设置,可以自由调整资源自动对应不同业务高峰(当然也可以降低费用成本),也方便项目后期的资源扩展,以及 ...

  9. mudos源码分析

    错误捕捉相关的代码在simulate.c void throw_error() { )->framekind & FRAME_MASK) == FRAME_CATCH) { LONGJM ...

  10. 【ARTS】01_22_左耳听风-201900408~2019004014

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...