C# 特性完全指南:预定义特性、自定义特性与元数据编程
特性是声明性标记,用于向运行时传达程序元素(类、方法、结构、枚举、程序集等)的行为信息。通过方括号 [ ] 放在目标元素上方。特性用于添加元数据:编译器指令、注释、描述、方法、类等。
.NET Framework 提供两类特性:预定义特性和自定义特性。
指定特性语法
[attribute(positional_parameters, name_parameter = value, ...)] element
特性名及值在方括号内,位于应用元素之前。位置参数指定必需信息,命名参数指定可选信息。
三大预定义特性
AttributeUsageConditionalObsolete
AttributeUsage
描述自定义特性类的使用方式,指定可应用的语言元素类型。语法:
[AttributeUsage(validon, AllowMultiple = allowmultiple, Inherited = inherited)]
validon:AttributeTargets枚举值组合,默认AttributeTargets.Allallowmultiple:是否允许多次应用,默认falseinherited:是否被派生类继承,默认false
示例
[AttributeUsage(
AttributeTargets.Class | AttributeTargets.Constructor |
AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property,
AllowMultiple = true)]
public class DeBugInfo : System.Attribute { ... }
Conditional
标记条件方法,执行依赖预处理符号。导致方法调用的条件编译。常用于调试/跟踪显示变量值。
语法:[Conditional("DEBUG")]
示例
#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();
}
}
输出(定义 DEBUG 时):
In Main function
In Function 1
In Function 2
未定义 DEBUG 时,所有 Message 调用被编译器移除,零开销。
Obsolete
标记程序实体不应使用。通知编译器丢弃特定目标元素。如新方法替代旧方法,标记旧方法过时并提示新方法。
语法:[Obsolete("message")] 或 [Obsolete("message", iserror)]
message:说明过时原因及替代方案iserror:true视为错误,false仅警告(默认)
示例
using System;
public class MyClass {
[Obsolete("Don't use OldMethod, use NewMethod instead", true)]
static void OldMethod() { Console.WriteLine("It is the old method"); }
static void NewMethod() { Console.WriteLine("It is the new method"); }
public static void Main() { OldMethod(); } // 编译错误
}
编译错误:Don't use OldMethod, use NewMethod instead
创建自定义特性
四步骤:
- 声明自定义特性类(继承
System.Attribute) - 构造自定义特性(定义构造函数、属性)
- 应用特性于目标程序元素
- 通过反射访问特性(下章详解)
声明自定义特性
// BugFix 特性,可应用于类及其成员,允许多次
[AttributeUsage(
AttributeTargets.Class | AttributeTargets.Constructor |
AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property,
AllowMultiple = true)]
public class DeBugInfo : System.Attribute { ... }
构造 DeBugInfo 特性
public class DeBugInfo : System.Attribute {
private int bugNo;
private string developer;
private string lastReview;
public string message;
// 位置参数:bug 编号、开发者、审查日期
public DeBugInfo(int bg, string dev, string d) {
this.bugNo = bg;
this.developer = dev;
this.lastReview = d;
}
public int BugNo { get { return bugNo; } }
public string Developer { get { return developer; } }
public string LastReview { get { return lastReview; } }
public string Message { get { return message; } set { message = value; } }
}
应用自定义特性
[DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "Return type mismatch")]
[DeBugInfo(49, "Nuha Ali", "10/10/2012", Message = "Unused variable")]
class Rectangle {
protected double length, width;
public Rectangle(double l, double w) { length = l; width = w; }
[DeBugInfo(55, "Zara Ali", "19/10/2012", Message = "Return type mismatch")]
public double GetArea() { return length * width; }
[DeBugInfo(56, "Zara Ali", "19/10/2012")]
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
常用预定义特性补充
| 特性 | 用途 |
|---|---|
[Serializable] | 标记类型可序列化 |
[NonSerialized] | 标记字段不参与序列化 |
[Flags] | 标记枚举为位标志 |
[DllImport] | 导入非托管 DLL 函数 |
[CallerMemberName] | 自动获取调用者成员名 |
[CallerFilePath] | 自动获取调用者文件路径 |
[CallerLineNumber] | 自动获取调用者行号 |
C语言
- AgCu20 合金:23°C 下全面力学与热学性能
- 合金15CDV6 (DIN 1.7734):高强度、高韧性、易焊接
- DIN 1.7734 15CDV6合金:高强度、高韧性、易焊接
- 15CDV6合金 (DIN 1.7734) – 高强度、易焊接、优异韧性
- PtNi10 铂镍合金 — 高强度高温电接触材料
- PtIr10 铂铱合金 — 高强度高温生物相容材料
- Corroplast 耐腐蚀钢板 – 精密加工用高性能塑料模具钢
- X46 AM FCE:关键管道应用用高性能 API 5L 钢材
- X56 AM FCE:高性能管道用优质 API 5L 钢材
- Ferro-Titanit® Cromoni – 高强度、非磁性钛合金
- C# 可空类型详解:安全处理 Null 值的最佳实践
- 掌握 Java 8 Optional:实现空安全代码的实用指南