一、核心知识点(必考)
1. 什么是 Conditional 条件特性
ConditionalAttribute(可简写为[Conditional])是 C# 提供的方法级别条件编译特性。
作用:根据是否定义了【编译符号】,决定方法是否生效、是否被编译、是否执行。
2. 核心规则
1、如果特性中标注的编译符号存在:方法正常编译、正常执行。
2、如果特性中标注的编译符号不存在:方法代码彻底被忽略、调用代码直接删除。
3、只作用于方法,不影响变量、逻辑、分支。
3. 和 #if 预处理指令的区别(考试简答)
#if:代码块级别的裁剪,手写麻烦、代码凌乱。
[Conditional]:方法级别的整洁裁剪,专门用于调试日志、测试方法,代码更优雅。
二、代码逐行超细解析
1. 编译符号定义与取消
#define Debug // 定义编译符号 Debug #undef Debug // 立即取消编译符号 Debug解析:
先定义、立刻取消 →最终项目中不存在 Debug 编译符号
2. 特性标记方法
[ConditionalAttribute("Debug")] public static void T1() { Console.WriteLine("1111"); }核心原理:
该特性含义:只有存在 Debug 编译符号,T1 方法才有效
当前 Debug 符号被取消 →T1 方法失效
3. 方法调用
static void Main(string[] args) { T1(); }超级重点(必考)
虽然代码写了T1();
但是因为符号不存在:编译器直接删除这行调用代码
程序运行:无输出、不报错、不执行
三、两种运行场景对比
场景一:当前代码(#undef 取消符号)
Debug 符号不存在 → T1 方法无效 → 调用被忽略 →无任何输出
场景二:注释掉 #undef(保留符号)
Debug 符号存在 → T1 正常编译运行 →输出:1111
四、语法细节
1、ConditionalAttribute和Conditional完全等价,可以简写:
[Conditional("Debug")]2、必须引入命名空间:using System.Diagnostics;(必须写,否则报错)
3、只能标记void 返回值方法(有返回值方法不能用)
五、核心特点总结(背诵)
1、条件特性是编译阶段生效,不是运行阶段
2、符号不存在时:方法代码 + 调用代码 全部失效
3、用于统一屏蔽调试代码、日志代码、测试代码
4、比#if更整洁、专业、企业级开发常用
六、易错坑点(考试必考)
1、忘记引用System.Diagnostics→ 特性报错
2、自定义符号区分大小写
3、有返回值的方法不能使用Conditional 特性
4、符号被 #undef 取消后,调用代码不会报错,只是静默失效
5、不是运行时判断,是编译时裁剪代码
七、可直接抄写纯净代码
namespace _5Obsolete废弃特性 { internal class Program { static void Main(string[] args) { Test1(); Test2(); } //参数1是废弃的信息 //参数2是 true,以后这个方法编译不通过,false 一警告的方式进行提示 [Obsolete("提示Test1有可能以后会被丢弃,会被test2方法进行替代",false)] static void Test1() { Console.WriteLine("Test1"); } static void Test2() { Console.WriteLine("Test2"); } } }Obsolete 废弃特性
一、核心概念
1. 什么是 Obsolete 特性
ObsoleteAttribute是 C# 内置的废弃标记特性,用于标记过时、废弃、不推荐使用的类、方法、字段、属性。
该特性在编译阶段生效,用于提示开发者代码已过时,建议更换新写法,是项目版本迭代、代码重构的核心特性。
2. Obsolete 双参数核心语法(必考)
语法格式:[Obsolete("废弃提示信息", 是否报错)]
参数1(string 类型):自定义提示文本,说明废弃原因、替代方案、更新提示。
参数2(bool 类型):编译级别控制
false:默认值,调用废弃代码仅弹出编译警告,程序可正常编译运行。
true:调用废弃代码直接触发编译错误,程序无法编译通过,强制禁止使用。
二、完整代码逐行精细解析
namespace _5Obsolete废弃特性 { internal class Program { static void Main(string[] args) { // 调用被标记废弃的方法 Test1(); // 调用新替代方法 Test2(); } // 标记方法为废弃状态 [Obsolete("提示Test1有可能以后会被丢弃,会被test2方法进行替代",false)] static void Test1() { Console.WriteLine("Test1"); } // 新的替代方法 static void Test2() { Console.WriteLine("Test2"); } } }代码逐段解析
1、[Obsolete(..., false)]:将 Test1 方法标记为废弃,仅警告、不阻断编译。
2、提示信息明确告知开发者:Test1 即将废弃,需使用 Test2 替代。
3、Main 方法中同时调用 Test1、Test2:编译器弹出警告,程序正常运行。
4、Test2 为全新替代方法,无任何废弃标记,正常编译运行。
三、两种参数模式效果对比(重点)
模式1:第二个参数 = false(当前代码模式)
效果:代码可以正常编译、正常运行
编译器提示:警告,展示自定义废弃提示文本
运行结果:控制台同时输出 Test1、Test2
模式2:第二个参数 = true
修改代码:[Obsolete("方法已废弃,请使用Test2替代", true)]
效果:调用 Test1 的代码直接编译报错
程序无法生成、无法运行,强制禁止使用废弃方法。
四、运行结果
控制台输出
Test1
Test2
编译器提示
出现警告:提示Test1有可能以后会被丢弃,会被test2方法进行替代
五、Obsolete 特性使用范围
可标记所有代码成员:方法、类、字段、属性、接口、枚举
核心用途:
1、项目版本迭代,淘汰旧代码
2、提示开发者使用新版替代方法
3、规范团队代码,禁止使用过时API
六、高频易错点(考试/作业必考)
1、Obsolete 是编译阶段特性,运行时无任何逻辑判断。
2、false = 警告不报错,true = 直接编译报错,严禁记反。
3、仅标记废弃不会删除代码,代码依然可执行,仅做提示限制。
4、无参数/单参数简写:[Obsolete]默认等同于 false 警告模式。
七、极简背诵总结
1、Obsolete 用于标记代码废弃过时;
2、参数1为废弃提示信息,参数2为编译级别;
3、false警告可运行,true报错不可编译;
4、作用:代码迭代更新,强制规范开发者使用新代码。
八、完整可运行代码
namespace _5Obsolete废弃特性 { internal class Program { static void Main(string[] args) { Test1(); Test2(); } //参数1是废弃的信息 //参数2是 true,以后这个方法编译不通过,false 一警告的方式进行提示 [Obsolete("提示Test1有可能以后会被丢弃,会被test2方法进行替代",false)] static void Test1() { Console.WriteLine("Test1"); } static void Test2() { Console.WriteLine("Test2"); } } }