亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C# 特性完全指南:预定义特性、自定义特性与元数据编程

特性是声明性标记,用于向运行时传达程序元素(类、方法、结构、枚举、程序集等)的行为信息。通过方括号 [ ] 放在目标元素上方。特性用于添加元数据:编译器指令、注释、描述、方法、类等。

.NET Framework 提供两类特性:预定义特性和自定义特性。

指定特性语法

[attribute(positional_parameters, name_parameter = value, ...)] element

特性名及值在方括号内,位于应用元素之前。位置参数指定必需信息,命名参数指定可选信息。

三大预定义特性

AttributeUsage

描述自定义特性类的使用方式,指定可应用的语言元素类型。语法:

[AttributeUsage(validon, AllowMultiple = allowmultiple, Inherited = inherited)]

示例

[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)]

示例

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

创建自定义特性

四步骤:

  1. 声明自定义特性类(继承 System.Attribute)
  2. 构造自定义特性(定义构造函数、属性)
  3. 应用特性于目标程序元素
  4. 通过反射访问特性(下章详解)

声明自定义特性


// 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语言

  1. AgCu20 合金:23°C 下全面力学与热学性能
  2. 合金15CDV6 (DIN 1.7734):高强度、高韧性、易焊接
  3. DIN 1.7734 15CDV6合金:高强度、高韧性、易焊接
  4. 15CDV6合金 (DIN 1.7734) – 高强度、易焊接、优异韧性
  5. PtNi10 铂镍合金 — 高强度高温电接触材料
  6. PtIr10 铂铱合金 — 高强度高温生物相容材料
  7. Corroplast 耐腐蚀钢板 – 精密加工用高性能塑料模具钢
  8. X46 AM FCE:关键管道应用用高性能 API 5L 钢材
  9. X56 AM FCE:高性能管道用优质 API 5L 钢材
  10. Ferro-Titanit® Cromoni – 高强度、非磁性钛合金
  11. C# 可空类型详解:安全处理 Null 值的最佳实践
  12. 掌握 Java 8 Optional:实现空安全代码的实用指南