在 C# 中,checked 和 unchecked 关键字分别起什么作用?请说明它们如何控制整数算术运算中的溢出检测行为。
考察说明
考查对 C# 中 checked 与 unchecked 关键字机制及其在溢出检测中作用的理解。
回答思路
- 【回答框架 1】checked 关键字用于启用整数算术运算的溢出检查。当运算结果超出目标类型的范围时,会抛出 OverflowException 异常。默认情况下,非 checked 上下文中的溢出会静默截断,只保留低位结果。
- 【回答框架 2】unchecked 关键字用于显式禁用溢出检查,即使代码位于 checked 上下文中,也会忽略溢出并截断结果。它适用于已知不会溢出或需要性能优化的场景,因为启用检查会带来轻微的性能开销。
- 【回答框架 3】在 C# 中,默认的溢出检查行为取决于编译选项和上下文。默认情况下,代码在 unchecked 上下文中执行,除非使用 checked 关键字或启用编译器的 /checked 选项。
- 【回答框架 4】可以通过 checked 和 unchecked 语句块或表达式来局部控制溢出检查。例如,checked { int x = int.MaxValue + 1; } 会抛出异常,而 unchecked { int y = int.MaxValue + 1; } 则不会。
- 【回答框架 5】对于常量表达式,默认行为是检查溢出,即使未显式使用 checked。这可能导致编译时错误,而非常量表达式则遵循运行时上下文。
- 【关键点 1】checked 启用溢出检查,溢出时抛 OverflowException。
- 【关键点 2】unchecked 禁用溢出检查,溢出时静默截断。
- 【关键点 3】默认运行时上下文为 unchecked,但常量表达式默认检查。
- 【关键点 4】可通过语句块或表达式局部控制检查范围。
- 【关键点 5】启用检查有轻微性能开销,适用于需要可靠性的场景。
- 【易错点 1】不要混淆默认行为:运行时默认 unchecked,但常量表达式默认 checked。
- 【易错点 2】避免在性能敏感路径中滥用 checked,除非确实需要溢出保护。
- 【易错点 3】注意 checked 只适用于整数类型,不适用于浮点运算。