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实现很重要,因为它很可能会溢出,而且我们不希望出现任何溢出异常,因为如果它环绕就可以了。
默认情况下,C# 项目不检查溢出和下溢。
右键单击项目,选择Properties,在Build底部的选项卡上选择Advanced...,选中标记为Check for arithmetic overflow/underflow
现在,默认行为是System.OverflowException在显式unchecked块中没有发生溢出时抛出。
如果您为项目自动生成覆盖Equals并GetHashCode为项目打开溢出检查,则未检查的块会按预期存在
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)
| 归档时间: |
|
| 查看次数: |
579 次 |
| 最近记录: |