在C#中,特性(Attributes)是一种将元数据应用于程序实体(如类、方法、属性等)的方式。这些元数据可以在编译时和运行时被读取,常用于配置、自定义行为、装饰器模式等场景。以下是一些C#中常用的特性:
-
[Serializable] - 表示该类可以被序列化,用于二进制序列化。
[Serializable] public class MyClass { }
-
[Obsolete] - 标记一个类、方法或属性为过时,如果代码中使用了这些元素,编译器会发出警告。
[Obsolete("Use NewClass instead.")] public class OldClass { }
-
[AttributeUsage] - 用于定义自定义特性的属性。
[AttributeUsage(AttributeTargets.Class, Inherited = false)] public class MyCustomAttribute : Attribute { }
-
[Conditional] - 用于条件编译,只有当定义了特定的符号时,方法才会被调用。
[Conditional("DEBUG")] public void DebugMethod() { }
-
[Flags] - 表示枚举类型可以用于位字段,即枚举值可以进行位运算。
[Flags] public enum MyFlags { None = 0, Option1 = 1, Option2 = 2 }
-
[DefaultValue] - 用于指定参数的默认值。
public void MyMethod([DefaultValue("true")] bool flag) { }
-
[ParamArray] - 允许方法接受不定数量的参数。
public void MyMethod([ParamArray] string[] args) { }
-
[DebuggerStepThrough] - 告诉调试器在调试时跳过该方法的代码。
[DebuggerStepThrough] public void MyMethod() { }
-
[DebuggerDisplay] - 控制调试器显示对象的方式。
[DebuggerDisplay("MyObject {MyProperty}")] public class MyObject { public int MyProperty { get; set; } }
-
[DebuggerBrowsable] - 控制调试器如何浏览对象的成员。
[DebuggerBrowsable(DebuggerBrowsableState.Never)] public int MyProperty { get; set; }
-
[CLSCompliant] - 表示程序元素是否符合公共语言规范(CLS)。
[CLSCompliant(true)] public class MyCompliantClass { }
-
[CallerMemberName] - 当使用
StringInfo
的InsertLineInfo
方法时,自动传递调用成员的名称。public void Trace([CallerMemberName] string memberName = "") { Console.WriteLine($"Called {memberName}"); }
特性的使用可以极大地提升代码的灵活性和表达能力