C#入门之checked和unchecked的区别实例解析
在C#编程中,整数类型(如int)的范围是固定的。当计算结果超出该范围时,系统默认行为可能导致数据错误且难以察觉。checked和unchecked是C#提供的两个关键字,用于控制算术运算、转换或显式转换操作中的溢出检查行为。掌握它们的区别,能有效防止隐蔽的Bug,提高程序安全性。
整数溢出的默认现象
int类型的最大值为2147483647。如果尝试将两个最大值相加,结果会超出上限。在未进行特殊配置的情况下,C#会忽略溢出并截断高位数据,导致结果变为一个负数。这往往不符合预期,尤其是在金融计算或精确计数场景中。
第1步:观察默认无检查时的溢出行为
目的:验证在没有checked或unchecked约束时,整数溢出的实际表现。
- 入口:Visual Studio 或任何C#编译器环境
- 动作:
- 声明两个
int变量并赋值为int.MaxValue(即2147483647) - 执行加法运算并打印结果
- 声明两个
- 重要参数:
int y = 2147483647;,int x = 2147483647;
class Program
{
static void Main(string[] args)
{
int y = 2147483647;
int x = 2147483647;
int z = x + y;
Console.WriteLine(z.ToString());
Console.ReadKey();
}
}
运行上述代码,控制台输出结果为-2。这是因为发生了整数溢出,二进制表示的回绕导致了负值出现。这种现象被称为“静默失败”,对于初学者来说容易误以为计算正常。
具体运行效果如下图所示:
一、使用checked强制检查溢出
checked关键字用于显式启用溢出检查。当在该关键字包围的代码块或表达式中发生整数溢出时,运行时环境将抛出System.OverflowException异常,从而中断程序流程,提醒开发者存在逻辑错误。
第2步:应用checked捕获溢出异常
目的:演示如何使用checked识别并处理整数溢出问题。
- 入口:C#代码编辑器
- 动作:
- 将溢出表达式包裹在
checked语句中 - 使用
try...catch结构捕获OverflowException
- 将溢出表达式包裹在
- 重要参数:
checked(x + y)
class Program
{
static void Main(string[] args)
{
int y = 2147483647;
int x = 2147483647;
try
{
int z = checked(x + y);
}
catch (OverflowException ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
}
执行此代码时,由于checked检测到溢出,不会返回错误的负数,而是直接进入catch块打印异常信息。这种机制有助于在开发阶段尽早发现数值越界bug。
抛出溢出异常的界面展示如下:
手动捕获并打印异常消息后的控制台输出示例:
二、使用unchecked保持静默模式
虽然大多数情况下建议开启溢出检查以保证安全,但在某些特定场景(如位运算、哈希算法或对性能极度敏感的底层循环)中,开发者可能希望保留默认的截断行为。此时可以使用unchecked关键字明确告诉编译器:“即使发生溢出,也不要抛出异常”。
第3步:在unchecked环境下执行运算
目的:展示如何显式禁用溢出检查以恢复默认行为。
- 入口:C#代码编辑器
- 动作:
- 在表达式外包裹
unchecked关键字 - 正常获取运算结果
- 在表达式外包裹
- 重要参数:
unchecked(x + y)
class Program
{
static void Main(string[] args)
{
int y = 2147483647;
int x = 2147483647;
int z = unchecked(x + y);
Console.WriteLine(z.ToString());
Console.ReadKey();
}
}
尽管这里显式指定了unchecked,但结果依然为-2。这是因为unchecked并未改变底层的数学运算逻辑,只是禁止了异常抛出的保护机制。它允许程序继续运行,但需由开发者自行确保数据截断符合业务需求。
总结
checked和unchecked的核心区别在于是否干预整数溢出时的异常处理:checked会主动报错以保障数据安全,适合常规业务逻辑;unchecked则维持静默截断,适用于需要兼容旧行为或追求极致性能的特殊算法。在实际开发中,默认构建配置通常开启溢出检查,合理使用这两个关键字能让你的C#代码更加健壮和可控。
以上就是C#中checked和unchecked区别的详细内容,更多关于C#入门知识的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









