Attribute预定义特性
转载自: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预定义特性的更多相关文章
- PHP预定义接口之 ArrayAccess
最近这段时间回家过年了,博客也没有更新,感觉少学习了好多东西,也错失了好多的学习机会,就像大家在春节抢红包时常说的一句话:一不留神错过了好几亿.废话少说,这篇博客给大家说说关于PHP预定义接口中常用到 ...
- .NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式
开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,. ...
- ES5基础之正则表达式02:范围类、预定义类和边界字符
1.范围类 //元字符 /* * 正则表达式由两种基本字符类型组成 * 1.原义文本字符:例如123abc * 2.元字符:元字符是在正则表达式中有特殊含义的非字母字符 */ //常见特殊符号:. * ...
- C++ 中常见预定义宏的使用
http://blog.csdn.net/hgl868/article/details/7058906 替代字符串: #define DOWNLOAD_IMAGE_LOG /var/log/png.l ...
- C#中一些默认的预定义属性
C#中一些默认的预定义属性,见下表: 预定义的属性 有效目标 说明 AttributeUsage Class 指定另一个属性类的有效使用方式 CLSCompliant 全部 指出程序元素是否与CLS兼 ...
- Silverlight 预定义颜色速查表
预定义颜色 可以使用 SolidColorBrush 绘制,它使用预定义纯色.这可以是 Colors 的静态属性 (Property) 名称,也可以是指定为 XAML 属性 (Attribu ...
- (一)预定义宏、__func__、_Pragma、变长参数宏定义以及__VA_ARGS__
作为第一篇,首先要说一下C++11与C99的兼容性. C++11将 对以下这些C99特性的支持 都纳入新标准中: 1) C99中的预定义宏 2) __func__预定义标识符 3) _Pragma操作 ...
- Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216 java c# php js.docx
Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216 java c# php js.docx 1.1. 预定义函数 魔术方法 魔术函数是什么1 1.2. & ...
- WebService -- Java 实现之 CXF ( 添加系统预定义的拦截器)
1. 概述 CXF允许我们在webservice的in/out位置添加拦截器.拦截器有两大分类,一类是系统预定义的:另一类是自定义拦截器. 2. 在server端添加拦截器. JaxWsServerF ...
随机推荐
- Ubuntu无法找到add-apt-repository问题的解决方法
网上查了一下资料,原来是需要 python-software-properties 于是 apt-get install python-software-properties 除此之外还要安装 s ...
- udp如何实现可靠性传输?
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 1udp与tcp的区别 TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接的 ...
- insmod内核模块时提示Failed to find the folder holding the modules怎么办?
答:笔者通过重新编译内核和根文件系统解决了此问题 (笔者使用的是openwrt系统) 分析: 1. ’Failed to find the folder holding the modules‘这句l ...
- Objective-C如何自己实现一个基于数组下标的属性访问模式
在iOS6.0以及OS X10.8之后,Apple引入了一套非正式协议(informal protocol)与Objective-C语法直接绑定.当你实现了这其中的方法之后即可使用数组下标来访问属性元 ...
- 14Flutter StatefulWidget有状态组件、页面上绑定数据、改变页面数据、实现计数器功能、动态列表
/** * Flutter StatefulWidget有状态组件.页面上绑定数据.改变页面数据 * 在Flutter中自定义组件其实就是一个类,这个类需要继承StatelessWidget/Stat ...
- HDU1003 最大连续子序列
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- Scala使用备注一
package com.ws.spark.study.scala import java.io.File import org.scalatest.FlatSpec import scala.io.S ...
- Cocos Creator Android打包 apk
这一篇讲的是用 Cocos Creator 编译器打包 Android APP 的时候遇到的一些问题,虽然说打包的过程不是很复杂,但是在其中还是会遇到各式各样的坑. 我们将项目用CCC(Cocos C ...
- Unit Testing, Integration Testing and Functional Testing
转载自:https://codeutopia.net/blog/2015/04/11/what-are-unit-testing-integration-testing-and-functional- ...
- 阿里云Centos 7.6安装Redis以及开启远程连接
下载地址:http://redis.io/download,下载最新稳定版本. 本教程使用的最新文档版本为 5.0.5,下载并安装: $ wget http://download.redis.io/r ...