在项目中接触到了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. 06002_Redis概述

    1.什么是Redis? (1)Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,他通过提供多种键值对数据类型类适应不同场景下的存储需求: (2)Redis是一种高级的key ...

  2. 监控Apache计数器

  3. 51 nod 1693 水群

    1693 水群 基准时间限制:0.4 秒 空间限制:524288 KB 分值: 160  难度:6级算法题  收藏  关注 总所周知,水群是一件很浪费时间的事,但是其实在水群这件事中,也可以找到一些有 ...

  4. 将maven中央仓库不存在的jar包添加到本地仓库

    这里有2个案例,需要手动发出Maven命令包括一个 jar 到 Maven 的本地资源库. 要使用的 jar 不存在于 Maven 的中心储存库中. 您创建了一个自定义的 jar ,而另一个 Mave ...

  5. HDU 4332 Contest 4

    顶好的一道题.其实,是POJ 2411的升级版.但POJ 2411我用的插头DP来做,一时没想到那道题怎么用状态DP,于是回头看POJ 2411那一道的状态DP,其实也很简单,就是每一行都设一个状态, ...

  6. How to start/stop DB instance of Oracle under Linux

    All below actions should be executed with "oracle" user account 1. Check the status of lis ...

  7. 为什么整个互联网行业都缺前端project师?

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  8. 一些.NET 项目中经常使用的类库

    Web自己主动化測试   Watin Selenium  Selenium git .net 集合类扩展实现C5 Subscriber/Publisher 模式 Rx Nats 防御式编程 断言库 流 ...

  9. hdu1276(士兵队列训练问题) java集合水过

    点击打开链接 有人说这题属于栈或者队列,个人认为说集合应该比較准确点. Problem Description 某部队进行新兵队列训练,将新兵从一開始按顺序依次编号.并排成一行横队,训练的规则例如以下 ...

  10. NOIP2017提高组 模拟赛15(总结)

    NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...