为什么 VS 2017 生成 GetHashCode 没有未经检查的块

TJ *_*ler 4 c# gethashcode visual-studio visual-studio-2017

我最近发现 Visual Studio 2017 可以为Equalsand自动生成覆盖GetHashCode,但我想知道为什么该GetHashCode实现不在未经检查的块中?

我用两个公共字符串属性 Foo 和 Bar 创建了一个简单的类,生成的GetHashCode实现如下所示。

public override int GetHashCode()
{
    var hashCode = -504981047;
    hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Foo);
    hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Bar);
    return hashCode;
}
Run Code Online (Sandbox Code Playgroud)

我的印象是未经检查的GetHashCode实现很重要,因为它很可能会溢出,而且我们不希望出现任何溢出异常,因为如果它环绕就可以了。

TJ *_*ler 5

默认情况下,C# 项目不检查溢出和下溢。

右键单击项目,选择Properties,在Build底部的选项卡上选择Advanced...,选中标记为Check for arithmetic overflow/underflow

现在,默认行为是System.OverflowException在显式unchecked块中没有发生溢出时抛出。

如果您为项目自动生成覆盖EqualsGetHashCode为项目打开溢出检查,则未检查的块会按预期存在

public override int GetHashCode()
{
    unchecked
    {
        var hashCode = -504981047;
        hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Foo);
        hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Bar);
        return hashCode;
    }
}
Run Code Online (Sandbox Code Playgroud)