基础问题
-
什么是C#特性(Attributes)?
- 答:C#特性是用于向程序元素(如类型、方法、属性等)添加元数据的声明性方式。特性可以在运行时通过反射访问,并用于控制程序行为或提供额外信息。
-
如何创建自定义特性?
- 答:自定义特性需要继承自
System.Attribute
类。示例如下:[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class MyCustomAttribute : Attribute { public string Description { get; } public MyCustomAttribute(string description) { Description = description; } }
- 答:自定义特性需要继承自
-
如何在程序中应用和读取特性?
- 答:可以通过在类、方法等上方使用方括号
[]
来应用特性,并通过反射读取。示例如下:[MyCustomAttribute("This is a custom attribute")] public class MyClass { } // 读取特性 var attributes = typeof(MyClass).GetCustomAttributes(typeof(MyCustomAttribute), false); if (attributes.Length > 0) { var myAttr = (MyCustomAttribute)attributes[0]; Console.WriteLine(myAttr.Description); }
- 答:可以通过在类、方法等上方使用方括号
进阶问题
-
什么是
AttributeUsage
特性?如何使用?- 答:
AttributeUsage
特性用于指定自定义特性可以应用到的程序元素类型以及特性使用的规则。示例如下:[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] public class MyCustomAttribute : Attribute { }
- 答:
-
请解释
Conditional
特性及其用途。- 答:
Conditional
特性用于在编译时有条件地包含方法调用。例如:[Conditional("DEBUG")] public void DebugOnlyMethod() { Console.WriteLine("This method is only called in DEBUG mode."); }
- 答:
-
如何在特性中使用命名参数?
- 答:命名参数用于在应用特性时为特性的属性设置值。示例如下:
[AttributeUsage(AttributeTargets.Class)] public class MyCustomAttribute : Attribute { public string Description { get; set; } public int Version { get; set; } } [MyCustomAttribute(Description = "Sample class", Version = 1)] public class MyClass { }
- 答:命名参数用于在应用特性时为特性的属性设置值。示例如下:
高级问题
-
解释特性与反射的关系及应用场景。
- 答:特性通常与反射结合使用,用于在运行时获取元数据并作出相应处理。例如,基于特性实现依赖注入框架、ORM框架等。
-
C#特性在单元测试中的应用。
- 答:特性在单元测试中广泛用于标识测试方法,例如
[TestMethod]
用于标识单元测试方法,[TestInitialize]
用于标识测试初始化方法等。
- 答:特性在单元测试中广泛用于标识测试方法,例如
-
特性如何影响代码编译或运行时行为?
- 答:某些特性会影响编译或运行时行为,例如
[Obsolete]
特性会在编译时生成警告,[DllImport]
特性用于P/Invoke调用等。
- 答:某些特性会影响编译或运行时行为,例如