Unchecked-keyword适用于代表?

时间:2015-09-23 12:08:45

标签: c# linq

我只是根据下面的答案创建一个辅助方法来计算多个值的哈希值:

What is the best algorithm for an overridden System.Object.GetHashCode?

方法如下:

std::string NULLTermination;
NullTermination.push_back('\0');

现在这让我想知道未经检查的范围究竟是什么。未选中是适用于当前创建的函数的东西,但由于我们使用的是Linq,我实际上并不确定会发生什么。创建委托在编译时创建一个新类,但是未经检查的关键字是否也应用于这些委托/类?文档不清楚(https://msdn.microsoft.com/en-us/library/a569z7k8.aspx)。

我知道以下构造:

static int HashItems(params object[] items)
{
    unchecked
    {
        const int prime1 = 17;
        const int prime2 = 23;

        return items
            .Select(item => item != null ? item.GetHashCode() : 0)
            .Aggregate(prime1, (current, itemHash) => current*prime2 + itemHash);
    }
}

1 个答案:

答案 0 :(得分:2)

(un)checked是一个C#级别的构造。它表现为不同的IL算术指令。所以CLR没有涉及这个问题。没有"范围"在CLR级别。

使用句法范围应用

(un)checked。语法上属于这种范围的任何算术指令都会受到影响。使用unchecked 会影响lambdas

您可能应该更喜欢第二个代码块,因为它将unchecked命令应用于更接近实际生效的点。理解起来更清楚。