c# - 为什么 VS 2017 生成没有未检查 block 的 GetHashCode

标签 c# visual-studio visual-studio-2017 gethashcode

我最近发现 Visual Studio 2017 可以为 EqualsGetHashCode 自动生成覆盖,但我想知道为什么 GetHashCode 实现是不在unchecked阻止?

我用两个公共(public)字符串属性 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;
}

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

最佳答案

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

右键单击项目,选择Properties,在底部的Build 选项卡上选择Advanced...,选中标有的框检查算术上溢/下溢

现在默认行为是抛出 System.OverflowException 如果在显式 unchecked block 中没有发生溢出。

如果您在为项目启用溢出检查的情况下为 EqualsGetHashCode 自动生成覆盖,那么未检查的 block 会按预期出现

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;
    }
}

关于c# - 为什么 VS 2017 生成没有未检查 block 的 GetHashCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54712609/

相关文章:

c++ - 当依赖库之一无法编译时,如何防止 Visual Studio 构建我的整个解决方案?

visual-studio - Visual Studio 从最近的解决方案列表中以管理员身份运行

r - 如何更改在 Visual Studio 2017 中运行的 R 版本?

c# - 如何在 asp.net core 中获取 .resx 文件字符串

c# - 默认值 C# 类

visual-studio-2010 - 如何设置我的 git 存储库以便能够轻松地在 Visual Studio 中重用项目

c++ - c++在visual studio中的一般用法

visual-studio - 使用 vs 2017 的 rust 扩展为 visual studio 2017 配置 rustup

c# - 全局资源下本土化的噩梦

c# - JIT 后的 .NET 代码是否与 native 代码一样执行