第三十一式:C# 特性 (灵符标签)

绝世
秘籍
冲儿,你见过道士画符吗?
在一把剑上贴一张“雷电符”,这把剑就有了雷电属性;贴一张“封印符”,这把剑就不能用了。
在 C# 里,这种贴在类、方法或属性上的“符咒”,叫做特性 (Attribute)
这符咒有什么用?能增加攻击力吗?
它主要是给编译器或者运行时(Runtime)看的。比如告诉编译器“这个方法已经过时了,别让人用了”。

1. 常用特性 - 江湖通用符

使用方括号 [] 来贴符。

[Obsolete] - 废弃符

贴了这张符,就表示这个招式已经老掉牙了,不推荐使用。


[Obsolete("这一招太慢了,请用辟邪剑法。")]
public void OldSkill()
{
    Console.WriteLine("慢吞吞的一剑...");
}
        

如果你调用这个方法,岳不群(编译器)会给你一个警告(Warning)。

[Serializable] - 封印符

表示这个对象可以被“序列化”(变成二进制流保存起来,或者通过网络传输)。


[Serializable]
class SecretBook
{
    public string Content = "欲练此功...";
}
        

2. 自定义特性 - 画符

你也可以自己画符。只需要创建一个继承自 Attribute 的类。


// 定义一张“门派符”
class SectAttribute : Attribute
{
    public string Name;
    public SectAttribute(string name) { Name = name; }
}

// 贴在人身上
[Sect("华山派")]
class LinghuChong { }
        
特性本身只是个标签,如果不去“读取”它,它就没有任何作用(除了 Obsolete 这种编译器认识的)。
要想让自定义符咒生效,还得学会下一招——反射 (Reflection)
📜

动手时刻:过时了

编写一个方法 UseIronSword()

给它加上 [Obsolete] 特性,提示“铁剑已锈,请换倚天剑”。

在 Main 方法里调用它,看看编译器会说什么?

查看参考答案

using System;

class Program
{
    [Obsolete("铁剑已锈,请换倚天剑", true)] // 如果第二个参数是 true,会直接报错而不是警告
    static void UseIronSword()
    {
        Console.WriteLine("挥舞铁剑...");
    }

    static void Main()
    {
        UseIronSword(); // 这里会看到绿色的波浪线(警告)或红线(错误)
    }
}
                    

成就解锁:【符咒师】 获得:黄纸朱砂