将值分配给对它来说太大的变量! (检查和未检查的概念)

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中识别已检查和未检查的异常?

检查异常和未检查异常不同之处

如何加载对我的机器来说内存太大的 .mat 文件的一部分?

Java 检查异常(checked exception)和未检查异常(unchecked exception)区别理解

java异常—检查异常(checked exception)和未检查异常(unchecked exception)

未分配 SSIS 脚本任务变量值