未选中关键字适用于委托
本文关键字:适用于 关键字 | 更新日期: 2023-09-27 18:14:03
我刚刚创建了一个助手方法,根据下面的答案计算多个值的哈希值:
重写System.Object.GetHashCode的最佳算法是什么?
方法如下:
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);
}
}
这让我想知道unchecked的范围到底是什么。Unchecked是应用于当前创建的函数,但由于我们使用Linq,我不确定会发生什么。创建委托时会在编译时生成一个新类,但是未检查的关键字是否也应用于这些委托/类?文档对此没有明确说明(https://msdn.microsoft.com/en-us/library/a569z7k8.aspx)。
我知道下面的结构:
static int HashItems(params object[] items)
{
const int prime1 = 17;
const int prime2 = 23;
return items
.Select(item => item != null ? item.GetHashCode() : 0)
.Aggregate(prime1, (current, itemHash) => unchecked(current*prime2 + itemHash));
}
(un)checked
是c#级别的结构。它表现为不同的IL算术指令。因此,中国共产党与这个问题无关。在CLR级别没有"作用域"。
(un)checked
在语法范围内应用。语法上处于这种作用域中的任何算术指令都会受到影响。lambda 受到您使用unchecked
的影响。
您可能更喜欢第二个代码块,因为它将unchecked
命令应用到更接近它实际生效的位置。这样更容易理解。