我只是根据下面的答案创建一个辅助方法来计算多个值的哈希值:
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);
}
}
答案 0 :(得分:2)
(un)checked
是一个C#级别的构造。它表现为不同的IL算术指令。所以CLR没有涉及这个问题。没有"范围"在CLR级别。
(un)checked
。语法上属于这种范围的任何算术指令都会受到影响。使用unchecked
会影响lambdas
您可能应该更喜欢第二个代码块,因为它将unchecked
命令应用于更接近实际生效的点。理解起来更清楚。