未选中关键字适用于委托

本文关键字:适用于 关键字 | 更新日期: 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命令应用到更接近它实际生效的位置。这样更容易理解。