我最近发现 Visual Studio 2017 可以为 Equals
和 GetHashCode
自动生成覆盖,但我想知道为什么 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 中没有发生溢出。
如果您在为项目启用溢出检查的情况下为 Equals
和 GetHashCode
自动生成覆盖,那么未检查的 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/