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_ ...
随机推荐
- 【codeforces 190C】STL
[题目链接]:http://codeforces.com/problemset/problem/190/C [题意] 让你根据去掉标点符号的; pair 以及 int这两种类型; 确定出一种类型; 使 ...
- PatentTips - Sleep state mechanism for virtual multithreading
BACKGROUND The present disclosure relates generally to information processing systems and, more spec ...
- SQLSERVER-存储过程知识点
原文链接:http://www.qeefee.com/article/000566 存储过程是一组预编译的SQL语句,它可以包含数据操纵语句.变量.逻辑控制语句等. 存储过程允许带参数: 输入参数:可 ...
- [TS] Class Properties Public, Private and Read Only Modifiers
In the constructor, we want to set the prop to readonly, you need to do like this: class Superhero { ...
- [LeetCOde][Java] Best Time to Buy and Sell Stock III
题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...
- 【Java】【Flume】Flume-NG启动过程源代码分析(一)
从bin/flume 这个shell脚本能够看到Flume的起始于org.apache.flume.node.Application类,这是flume的main函数所在. main方法首先会先解析sh ...
- iOS开发- 生成/解析.vcf文件
vcf, 通讯录导出的一种格式. 一.生成vcf文件 假设要把我们iPhone通讯录里的数据, 生成vcf格式文件. 我们能够借助iCloud. 小技巧:通过iCloud导出iPhone通讯录的方法 ...
- POJ 3694 Network(Tarjan求割边+LCA)
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10969 Accepted: 4096 Descript ...
- python 3.x 学习笔记8 (os模块及xml修改)
1.os模块操作 os.getcwd(): # 查看当前所在路径. os.listdir(path): ...
- Android之通过HttpURLConnection.getResponseCode状态码抛出异常的问题以及解决方法
1.最近,在学习解析json数据的时候遇到一个错误信息,错误信息如下图所示: 发现解析出来的数据为空,错误信息如上图所示,发现程序中的HttpUtils工具类的22行出现了错误和MainActiv ...