C# ConditionalAttribute 条件特性+Obsolete 废弃特性 一、核心知识点必考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(废弃提示信息, 是否报错)]参数1string 类型自定义提示文本说明废弃原因、替代方案、更新提示。参数2bool 类型编译级别控制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 的代码直接编译报错程序无法生成、无法运行强制禁止使用废弃方法。四、运行结果控制台输出Test1Test2编译器提示出现警告提示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); } } }