C# 高级编程:特性深度解析

在 C# 中,特性(Attribute) 是一种强大的元数据声明机制,允许开发者为代码(类型、成员、程序集等)添加描述性信息。这些信息可在编译时或运行时被读取,用于控制代码行为、生成文档、实现框架逻辑(如序列化、依赖注入)等。

一、特性基础:元数据与声明式编程

1. 什么是特性?

特性是一种声明性标签,用于向程序添加额外信息。这些信息存储在程序集的元数据中,可通过反射(System.Reflection)或编译时工具(如 Source Generator)访问。特性的核心作用是:

  • 描述代码: 为类型、成员等添加语义说明(如 [Obsolete] 标记过时成员)。
  • 控制行为: 影响编译器或运行时的逻辑(如 [Conditional] 控制方法是否编译)。
  • 驱动框架: 作为框架的配置元数据(如 [Serializable] 标记可序列化类)。

2.特性的基本语法

特性通过 [AttributeName] 语法应用于目标(类、方法、属性、参数等),命名规范要求特性类以 Attribute 结尾(使用时可省略后缀)。

// 应用特性到类
[Serializable] // 等价于 [SerializableAttribute]
public class User {
   
    // 应用特性到属性
    [Required(ErrorMessage = "姓名必填")] 
    public string Name {
    get; set; }
    
    // 应用多个特性(顺序可选)
    [Obsolete("使用 NewMethod() 替代", true)] // 第二个参数为 error 时强制报错
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public void OldMethod() {
    }
}

二、内置特性:C# 框架的核心工具

1. 通用特性

  • [AttributeUsage]

    用于定义自定义特性的适用范围(目标)和行为(如是否可重复、是否继承)。
    示例:限制特性只能应用于类且不可重复

    [AttributeUsage(
    	    AttributeTargets.Class, 
    	    AllowMultiple = false,  // 不允许同一目标多次应用
    	    Inherited = true        // 子类继承该特性
    	)]
    	public class MyClassAttribute : Attribute {
          }
    
  • [Obsolete]

    标记成员过时,编译器会生成警告或错误(通过 isError 参数控制)。

    [Obsolete("该方法已过时,建议使用 V2 版本", isError: true)] // 调用时编译报错
    public void LegacyMethod() {
          }
    

2.代码生成与编译特性

  • [Conditional]

    根据预处理器符号(如 DEBUG)决定方法是否包含在编译结果中。

    [Conditional

你可能感兴趣的:(C#,高级教程,c#)