将值分配给对它来说太大的变量! (检查和未检查的概念)
Posted
技术标签:
【中文标题】将值分配给对它来说太大的变量! (检查和未检查的概念)【英文标题】:Assigning Value to a variable that is too big for it! (checked and unchecked concept) 【发布时间】:2011-03-05 09:18:10 【问题描述】:所以当我们给一个变量赋值时,那个变量应该能够容纳它,对吧?如果不是编译器会产生错误。现在 C# 中有一个选项,称为 Checked(默认情况下)和 unchecked 选项。但是 unchecked 有实际用途吗?外行的任何cmets? :)
例子:
int a=int.MaxValue;
int b=int.MaxValue;
unchecked
int sum=a+b;
【问题讨论】:
When must we use checked operator in C#?的可能重复 【参考方案1】:unchecked 的实际用途是它更快。
选中 [...] 是 [...] 默认值
非常量表达式的默认值是未选中的(除非编译器或执行环境另有指定)。这是 C# 以安全为代价选择性能的少数几次之一。由于大多数代码从未接近极限,因此在实践中很少出现问题。
【讨论】:
默认检查 const 表达式。对于非常量,它取决于编译器选项和环境。当然,对于大多数开箱即用 VS 的人来说,这将被取消选中,但这不应与“默认 C#”设置相混淆。【参考方案2】:除了@Mark Byers 提到的速度问题之外,我在计算对象的哈希码时使用了unchecked
- 从多个项目(例如,对象成员)创建哈希码的典型方法是迭代将您的工作哈希码乘以某个因子,然后添加新项目的哈希码并重复。这会产生通常会溢出 int 的数字,但我们不关心多余的数字,因此使用 unchecked 可以使操作成为可能(并且速度很快)。
另请注意,根据checked article on MSDN,未选中不是非常量表达式的默认值。在这种情况下,运行时检查行为取决于编译器选项和环境配置。特别是,我注意到过去使用SharpDevelop 构建时,除非我指定不同的内容,否则我会得到检查行为。
【讨论】:
【参考方案3】:我过去使用它的一种方法是将 COM 错误代码表示为整数。这很方便,因为 COMException 对象的 ErrorCode 属性是一个 int,但您将看到的几乎所有文档都引用 0x800... 形式
例如
const int knownErrorCode = unchecked((int)0x800AC472);
try
// Some COM code that could blow up
catch (COMException ex)
if (ex.ErrorCode == knownErrorCode )
// Do stuff
【讨论】:
以上是关于将值分配给对它来说太大的变量! (检查和未检查的概念)的主要内容,如果未能解决你的问题,请参考以下文章
Java 检查异常(checked exception)和未检查异常(unchecked exception)区别理解