这可能是你看过最简单的C# Attribute解析

Attribute是什么(定义)

Attributes provide a powerful method of associating metadata, or declarative information, with code (assemblies, types, methods, properties, and so forth). After an attribute is associated with a program entity, the attribute can be queried at run time by using a technique called reflection.

上面这段是微软官方文档给出的定义,看不懂也没关系。
用我理解简单地描述一下(用人话说)Attribute其实就是被添加进代码的注释。你只要知道Attribute这个东西本质就是一个注释,只是这个注释加进来代码里。那为什么要把注释加进代码里呢?目的就是为了当这个方法被调用的时候,可以根据这个方法的Attribute来进行决策如何调用这个方法

Attribute是作用

Attribute的作用是为元数据添加内容。
元数据可以被工具支持,比如:编译器用元数据来辅助编译,调试器用元数据来调试程序。

Attribute详细解释

举个例子

public class A : Person
{
	[PersonAttribute(Name="JOJO")]
	public void do_human()
	{
		Console.WriteLine("Do Human");
	}
}

public class B : Person
{
	[PersonAttribute(Name="DIO")]
	public void do_human()
	{
		Console.WriteLine("Do not Human");
	}
}

public class C : Person
{
	[PersonAttribute(Name="KAQY")]
	public void do_human()
	{
		Console.WriteLine("Do Human");
	}
}

现在有一个需求,需要处理从外部传来的一个Person集合,这里面有一个B,但是我不想让这个B执行do_human,那咋办,首先可以通过is进行一个一个的判断,但是当Person的子类很多的时候,这样写的代码无疑是冗杂的。而且C我想让他执行do_human的时候额外做其他事怎么办,难道我又要一个一个判断吗?(这里设想的例子比较简单,懂我意思即可,就是处理复杂情况下,可以直接根据Attribute来进行决策
这个时候就可以使用Attribute来进行判断,如果Name是DIO就不让执行,如果是JOJO就让其执行,当其为KQY的时候可以直接让其做其他的事。
这里所有的切都发生在这个do_human这个方法被调用之前,来根据属性进行决策判断。可以从这里我略窥c#中设计Attribute的目的,目的就是为了在反射的时候更智能的进行决策

Attribute格式

在使用Attribute的时候,有“长记法”和“短记法”两种

//长记法
[PersonAttribute(Name="DIO")]
public void do_human()
{
	Console.WriteLine("Do not Human");
}
//短记法
[Person(Name="JOJO")]
public void do_human()
{
	Console.WriteLine("Do Human");
}

Conditional

这个预定义特性标记了一个条件方法,其执行依赖于指定的预处理标识符。

它会引起方法调用的条件编译,取决于指定的值,比如 Debug 或 Trace。例如,当调试代码时显示变量的值。

规定该特性的语法如下:

#define DEBUG
using System;
using System.Diagnostics;
public class Myclass
{
    [Conditional("DEBUG")]
    public static void Message(string msg)
    {
        Console.WriteLine(msg);
    }
}
class Test
{
    static void function1()
    {
        Myclass.Message("In Function 1.");
        function2();
    }
    static void function2()
    {
        Myclass.Message("In Function 2.");
    }
    public static void Main()
    {
        Myclass.Message("In Main function.");
        function1();
        Console.ReadKey();
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

In Main function
In Function 1
In Function 2

当把第一行改成#define RELEASE则不会打印显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值