2

MSDN 示例只是编译时错误。

只是我看到@JonSkeet 在这里使用了它的答案:https://stackoverflow.com/a/263416/360211我不明白为什么它只是编译时间。

    static void Main()
    {
        const int x = 4;
        int y = int.MaxValue;
        int z = x*y;
        Console.WriteLine(z);
        Console.ReadLine();
    }

产生-4,与此相同:

    static void Main()
    {
        unchecked
        {
            const int x = 4;
            const int y = int.MaxValue;
            int z = x*y; // without unchecked, this is compile error
            Console.WriteLine(z);
            Console.ReadLine();
        }
    }

这会引发运行时:

    static void Main()
    {
        checked
        {
            const int x = 4;
            int y = int.MaxValue;
            int z = x*y; //run time error, can checked be set system wide?
            Console.WriteLine(z);
            Console.ReadLine();
        }
    }

那么 Jon 这样做是因为它可以设置系统范围、编译器标志或其他方式吗?

4

3 回答 3

1

绝对不。它确定如果操作溢出,是否在执行时抛出异常(OverflowException) 。

例如,在Noda Time中,我们几乎在检查上下文中执行所有算术(这是项目默认设置)。然而,对于哈希码,我们总是使用一个unchecked块,因为哈希码计算溢出绝对没问题——值的大小并不重要;溢出不会影响正确性。

它仅在编译时与编译器可以知道由于涉及常量值而溢出的操作相关。

有关详细信息,请参阅 C# 4 规范的第 7.6.12 节。

于 2012-11-16T15:58:14.763 回答
1

在实际计算值时执行操作是否在 achecked或块中。unchecked当两个变量相乘/相加时,这几乎总是在运行时,因为它们在编译时是未知的。

在您的示例中,这两个变量都是常量;这意味着编译时文字之间的计算结果可以在编译时完成(确实如此)。由于结果是在编译时计算的,而且它不在一个unchecked块中,所以它不能在没有错误的情况下计算结果。这并不意味着检查/未检查块通常是编译时检查;他们很少。

是的,可以更改整个代码库是否处于选中/未选中上下文中的项目属性。如果您正在编写一个库,也可以从任一上下文中调用该方法。出于这个原因,如果有一个代码块必须在已检查或未检查的上下文中运行,那么添加这样的块是一个好习惯,即使您当前的项目设置对于该方法是正确的。此外,如果不出意外,它使该片段的意图对未来的读者更清楚,“此方法依赖于整数溢出”与“此方法绝不能溢出”。

于 2012-11-16T16:00:51.883 回答
0

通过转到以下位置设置既不checked或代码的默认行为:unchecked

项目属性->构建->高级->检查算术上溢/下溢

新项目的默认设置是关闭的,这就是我认为unchecked没有运行时影响的原因。

于 2012-11-16T16:09:03.183 回答