在项目中接触到了Attribute,那么什么是Attribute,有些什么作用呢?这里来了解一下。

一、什么是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. BI之SSAS完整实战教程6 -- 设计维度、细化维度上:创建维度定义特性关系

    前面我们使用过数据源向导.数据源视图向导.Cube向导来创建相应的对象. 本篇我们将学习使用维度向导来创建维度. 通过前面几个向导的学习,我们归纳一下共同点,主要分成两步 1. 使用某种对象类型的向导 ...

  2. stl源代码剖析:编译器的提前定义位置集设置

    眼下我的工作环境还是win.全部演示也用VS或者cygwin这些环境作为基础. 1.配置项目的附加include目,添加提前定义位置集设置,编译器会把它添加include路径,比方在某个目录中定义一个 ...

  3. php常量,提前定义常量,魔术常量及基本数据类型

    常量 定义: 形式一 // define("PI",常量值); define("PI",3.14); define("school",&qu ...

  4. 快学Scala 第十二课 (抽象类, 抽象字段, 提前定义)

    抽象类: Scala 抽象类中,抽象方法不需要使用abstract. 在子类中重写超类抽象方法时,不需要使用override. abstract class Person { def say(s: S ...

  5. Scrapy框架的学习(6.item介绍以及items的使用(提前定义好字段名))转载https://blog.csdn.net/wei18791957243/article/details/86259688

      在Scrapy框架中的items.py的作用   1.可以预先定义好要爬取的字段     items.py import scrapy     class TencentItem(scrapy.I ...

  6. Android开发之style属性和提前定义样式

    摘要 Android平台定义的主题样式: android:theme="@android:style/Theme.Dialog" // 将一个Activity显示为对话框模式and ...

  7. swift 编译提前定义 --不知道怎么定义,可是能够#if

    var v:Int; #if _COND//不知道怎么定义.可是能够#if v = ; #else ; #endif println(v);//2

  8. Python高级用法------字典无需提前定义key

    from collections import defaultdict import json def tree(): return defaultdict(tree) categories = tr ...

  9. C标准提前定义宏,调试时加打印非常实用

    #include<stdio.h> int main(int argc, char *argv[]) { printf("File:[%s]\r\n", __FILE_ ...

随机推荐

  1. IOS系统兼容input keyup事件

    最近在做移动端模糊搜索功能,js监听input的keyup事件,在chrom模拟器和android手机环境运行都没有问题,到了ios手机却出现bug,没法实现功能: 查了好一会资料,发现keyup事件 ...

  2. 2015 Multi-University Training Contest 3 hdu 5318 The Goddess Of The Moon

    The Goddess Of The Moon Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  3. CF16A Flag

    CF16A Flag 题意翻译 题目描述 根据一项新的ISO标准,每一个国家的国旗应该是一个n×m的格子场,其中每个格子最多有10种不同的颜色.并且国旗应该有条纹:旗帜的每一行应包含相同颜色的方块,相 ...

  4. C++函数的导出与导入

    DLL使用 (1)隐式链接到 DLL 的可运行文件在生成时链接到导入库(.lib文件). (2)採用显式连接(LoadLibrary和GetProcAddress)时,不须要.lib文件. 函数导出方 ...

  5. 【转载】SQLITE3 使用总结

    转载自网友董淳光的文章. 前序: 这里要注明,我是一个跨平台专注者,并不喜欢只用 windows 平台.我以前的工作就是为 unix 平台写代码.下面我所写的东西,虽然没有验证,但是我已尽量不使用任何 ...

  6. hdu 4521 小明系列问题——小明序列(线段树+DP或扩展成经典的LIS)

    小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  7. ES线程池设置

    每个Elasticsearch节点内部都维护着多个线程池,如index.search.get.bulk等,用户可以修改线程池的类型和大小,线程池默认大小跟CPU逻辑一致 一.查看当前线程组状态 cur ...

  8. Windows phone解决GB2312编码问题

    环境win8+vse for Windows phone 在网站http://encoding4silverlight.codeplex.com/上点击下载 之后有三个文件big5.bin,DBCSE ...

  9. (转)script标签到底该放在哪里

    一般script标签会被放在头部或尾部.头部就是<head>里面,尾部一般指<body>里[4-5]. 将script放在<head>里,浏览器解析HTML,发现s ...

  10. Mac 如何修改Mac系统的默认截图路径

    step 1 :打在桌面或者其他任意位置创建一个文件夹:截图图库.我创建的路径是:/Users/yilin/Documents/截图图库(仅供参考) step 2:打开终端,输入以下命令:defaul ...