Attribute(一)——提前定义特性
在项目中接触到了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(一)——提前定义特性的更多相关文章
- BI之SSAS完整实战教程6 -- 设计维度、细化维度上:创建维度定义特性关系
前面我们使用过数据源向导.数据源视图向导.Cube向导来创建相应的对象. 本篇我们将学习使用维度向导来创建维度. 通过前面几个向导的学习,我们归纳一下共同点,主要分成两步 1. 使用某种对象类型的向导 ...
- stl源代码剖析:编译器的提前定义位置集设置
眼下我的工作环境还是win.全部演示也用VS或者cygwin这些环境作为基础. 1.配置项目的附加include目,添加提前定义位置集设置,编译器会把它添加include路径,比方在某个目录中定义一个 ...
- php常量,提前定义常量,魔术常量及基本数据类型
常量 定义: 形式一 // define("PI",常量值); define("PI",3.14); define("school",&qu ...
- 快学Scala 第十二课 (抽象类, 抽象字段, 提前定义)
抽象类: Scala 抽象类中,抽象方法不需要使用abstract. 在子类中重写超类抽象方法时,不需要使用override. abstract class Person { def say(s: S ...
- Scrapy框架的学习(6.item介绍以及items的使用(提前定义好字段名))转载https://blog.csdn.net/wei18791957243/article/details/86259688
在Scrapy框架中的items.py的作用 1.可以预先定义好要爬取的字段 items.py import scrapy class TencentItem(scrapy.I ...
- Android开发之style属性和提前定义样式
摘要 Android平台定义的主题样式: android:theme="@android:style/Theme.Dialog" // 将一个Activity显示为对话框模式and ...
- swift 编译提前定义 --不知道怎么定义,可是能够#if
var v:Int; #if _COND//不知道怎么定义.可是能够#if v = ; #else ; #endif println(v);//2
- Python高级用法------字典无需提前定义key
from collections import defaultdict import json def tree(): return defaultdict(tree) categories = tr ...
- C标准提前定义宏,调试时加打印非常实用
#include<stdio.h> int main(int argc, char *argv[]) { printf("File:[%s]\r\n", __FILE_ ...
随机推荐
- 【Android】桌面歌词悬浮效果简单实现
在使用"网易云音乐"的时候,发现有一个显示"桌面歌词"的功能,于是就想着自己实现下.查了下资料,是用WindowManage实现的.实现过程中也出现了些问题,看 ...
- 关于Servo项目中Rust代码行数的数据来源
我两个月之前的一篇博客<为什么我说Rust是靠谱的编程语言>(下面简称原文),在当中"6. 两个半大型成功案例"一节.我以前写道: Servo: 下一代浏览器渲染引擎( ...
- 面试-MySQL
1 事务的特性 事务具有四个特性:原子性(Atomicity).一致性(Consistency).隔离性(Isolation)和持续性(Durability).这四个特性也简称ACID性. (1)原 ...
- jquery outerHeight方法 outerWidth方法 获取元素实际宽度高度
曾经写代码中,每当须要获取元素的实际"宽度"(这里的宽度是指元素宽度加上其边距)时,都须要用元素宽度加上margin值才行,今天发现一个叫outerWidth(options)的方 ...
- X-射线:探索原子世界的利器
请看下图: 上图是在现代量子力学意义上的氦(Helium)原子图像,原子像是一个黑乎乎的"小云团"(电子云包围着原子核).原子的半径大约仅仅有1埃. "埃"的符 ...
- FireEye APT检测——APT业务占比过重,缺乏其他安全系统的查杀和修复功能
摘自:https://zhidao.baidu.com/question/1694626564301467468.html火眼,APT威胁下快速成长 FireEye的兴起开始于2012年,这时段正好迎 ...
- ElasticSearch Shard——本质上是做分布式扩展,副本对于集群的稳定性有很强的影响
什么是一个Shard? Shard就是一个Lucene Index,参照文章(深入理解Shard和Lucene Index). Index需要多少个Shard? 回答这个问题,我们需要先谈谈节点,一个 ...
- xBIM 基础06 将STEP物理文件转换为XML
系列目录 [已更新最新开发文章,点击查看详细] 一.STEP标准简介 STEP,它是Standard for the Exchange of Product model data的缩写.产品数 ...
- Swift学习笔记(8):闭包
目录: 基本语法 尾随闭包 值捕获 自动闭包 闭包是自包含的函数代码块,闭包采取如下三种形式之一: ・全局函数是一个有名字但不会捕获任何值的闭包 ・嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包 ...
- DBMS_XPLAN详细说明
执行计划的组成部分 正确的看执行计划 DBMS_XPLAN 这个包是一个很好查看执行计划,显示很多格式,来分析执行计划中存在的问题 format:控制详细执行计划输出的格式,包含以下内容: BASIC ...