在项目中接触到了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. Js原生实现抽奖功能

    <div>代码 按钮代码 JS原生代码  完整的代码: <div style="width:365px;height:300px;border:2px solid gree ...

  2. Spring+Mybatis+SpringMVC后台与前台分页展示实例

    摘要:本文实现了一个后台由spring+Mybatis+SpringMVC组成,分页采用PageHelper,前台展示使用bootstrap-paginator来显示效果的分页实例.整个项目由mave ...

  3. UML基础知识点

    UML   :   unified Modeling Language  统一建模语言 1.对系统问题进行分析和建模 2.非专利的第三代建模和规约语言 3.UML是一种开放的方法.用于说明.可视化.构 ...

  4. .C#-NET开源方向基本

    我的理解,nancyFx是一个.net的微型框架,可以在Linux环境下运行,ServiceStack也是全平台框架,更大一些 owin的概念:Open Web Server Interface Fo ...

  5. 【从零之六&amp;完结】android口语对话系统(RavenClaw java版 含所有源代码)

    ! !! 更新:最新源码放到了github上,认为还不错点个星啊! 点击打开链接 做了一个半月最终完毕了,以下这个就是我參考Olympus/RavenClaw系统编写的对话管理系统.眼下实现了一个简单 ...

  6. Qt 3D教程(三)实现对模型材质參数的控制

    Qt 3D教程(三)实现对模型材质參数的控制 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/47131841.欢迎同行前来探讨. ...

  7. WinForm容器内控件批量效验是否同意为空?设置是否仅仅读?设置是否可用等方法分享

    WinForm容器内控件批量效验是否同意为空?设置是否仅仅读?设置是否可用等方法分享 在WinForm程序中,我们有时须要对某容器内的全部控件做批量操作.如批量推断是否同意为空?批量设置为仅仅读.批量 ...

  8. MVVM 中 ViewModelBase和 CommandBase

    public class ViewModelBase : INotifyPropertyChanged , IDisposable { public virtual string DisplayNam ...

  9. Android webView 缓存 Cache + HTML5离线功能 解决

    时间 -- :: CSDN博客 原文 http://blog.csdn.net/moubenmao/article/details/9076917 主题 Android HTML5 WebView的缓 ...

  10. iOS声明变量详解

    内容概述: 本文主要讲述了ios中多种声明变量方式的区别与联系,以及@interface声明的成员变量与@property属性的差异.最后介绍了推荐的声明方式. atany原创,转载请注明博主与博文链 ...