特性是一种我们向程序的程序集增加元数据的语言结构。它是用于保存程序结构信息的某种特殊类型的类
将应用了特性的程序结构叫做目标
设计用来获取和使用元数据的程序(对象浏览器)叫做特性的消费者
#define IsShow
using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
namespace _13_特性
{
class Program
{
[Obsolete("这个方法已经被弃用了,请使用NewTest方法",false)]//特性:弃用 ,使用""能提示开发人员,后面true代表完全不能使用该方法,false是还能继续使用
static void Test()
{
Console.WriteLine("test");
}
static void NewTest()
{
Console.WriteLine("new test");
}
[Conditional("IsShow")]//使用该方法要先定义宏,当宏存在时就可以使用该函数,当宏不存在该函数也不会被使用
static void Show(string str)
{
Console.WriteLine(str);
}
//[CallerLineNumber]该特性是输出哪一行会调用这个方法
//[CallerFilePath]该特性是返回调用该函数的文件名字
//[CallerMemberName]该特性是返回的哪个函数用的这个方法
[DebuggerStepThrough]//该特性代表调试的时候会跳过这个函数内部
static void ShowLine(string str,[CallerLineNumber]int lineNumber = 0,[CallerFilePath]string file=null,[CallerMemberName]string main=null)
{
Console.WriteLine(str);
Console.WriteLine(lineNumber);
Console.WriteLine(file);
Console.WriteLine(main);
}
static void Main(string[] args)
{
Test();
Show("Start");
Console.WriteLine("Work");
Show("Emd");
ShowLine("123");
}
}
}
自定义特性
using System;
using System.Collections.Generic;
using System.Text;
namespace _14_自定义特性
{
[AttributeUsage(AttributeTargets.Class)]//运用系统自带的特性,表面这个我们自己写的特性只作用于类的
internal sealed class MyAttribute:Attribute
{
//开发者
public string developer;
//版本
public string version;
//描述主要作用
public string description;
public MyAttribute(string developer, string version, string description)
{
this.developer = developer;
this.version = version;
this.description = description;
}
}
}
using System;
namespace _14_自定义特性
{
[My("yuan","v1.1","测试")]
class Program
{
static void Main(string[] args)
{
Type t = typeof(Program);
bool result = t.IsDefined(typeof(MyAttribute), false);
object[] att = t.GetCustomAttributes(false);//用该方法得到一个所有特性的元素
}
}
}