当前位置: 首页 > news >正文

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、ConditionalAttributeConditional完全等价,可以简写:

[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"); } } }
http://www.jsqmd.com/news/1119320/

相关文章:

  • stm32四轴飞行器BUG篇
  • 终极DLSS切换秘籍:3步解锁游戏性能新境界
  • CentOS8.0编译源码安装nginx和防火墙使用
  • 政企汇报宣传片为什么离不开 3D 动画?
  • PCB设计中孤铜现象的影响与AD18处理技巧
  • 奇门取号报“订单号不一致”?一次 trade_order_list 的排查实录
  • 《唤醒你的AI同事:WorkBuddy从零上手》034:提示词编写技巧
  • YOLO11全任务适配指南:检测、分割、姿态估计的性能调优技巧
  • 48. OrCAD在创建封装库时,管脚数目很多的元器件应该怎么合理?I Cadence Allegro 电子设计 快问快答
  • 设备单元级(L1)实施路径
  • 批量压缩图片还在用在线工具?这款648KB小软件,画质不变体积暴减
  • 不用喂食不用换水的“水族箱”、逆向净水器的智能水龙头,接入 Home Assistant、用 RF 破解把吊扇接入智能家居|DF创客周刊(第178期)
  • 星火X1 0725 vs 豆包:办公场景下AI模型精准能力实测
  • 混凝土裂隙数据集 建筑物裂缝分割数据集 1000张yolo数据集
  • 【AI编程代码审查黄金标准】:20年资深架构师亲授5大质量保障铁律,错过再等十年?
  • JMeter分布式压测实战:突破单机瓶颈,模拟海量并发
  • 高速PMSM无感控制三大难题与工程解决方案
  • ShadingModel与Lighting
  • ClaudeAPI 医疗场景落地指南:适用边界、提示词与审核流程
  • C++语言基础1:作用域解析运算符“::”详细讲解
  • Scrum落地避坑指南:一个技术负责人踩过的5个流程管理深坑与解法
  • 云服务器已进入黑暗森林时代
  • 【Linux网络】深入 HTTP 协议(一):从初识到 URL 编解码底层探索
  • 【AVRCP】规范精讲[38]:本地调节音量,控制器如何同步感知与更新
  • 演唱会、音乐会适合用的Tally灯
  • DLSS Swapper终极指南:如何智能切换DLSS版本提升游戏帧率
  • 《唤醒你的AI同事:WorkBuddy从零上手》035:工作流程优化
  • 【C++】008、sizeof与strlen的区别
  • 无刷电机控制系统架构与优化实践
  • Kimi K2.5 vs GPT-5.4编程实测:长文本与推理能力硬核对比