C# 是否存在将角色返回到−;2147483648是否溢出?
我正在实现一个对象树。此树中的每个类都有一些属性和一个GetHashCode()方法。我计划做的是组合所有属性的散列,然后将该散列与子节点的散列组合。我现在不在Visual Studio前面,但代码如下所示:C# 是否存在将角色返回到−;2147483648是否溢出?,c#,C#,我正在实现一个对象树。此树中的每个类都有一些属性和一个GetHashCode()方法。我计划做的是组合所有属性的散列,然后将该散列与子节点的散列组合。我现在不在Visual Studio前面,但代码如下所示: class Node { public int Prop1 {get; set;} public string Prop2 {get; set;} public IEnumerable<Node> Children {get; set; } private in
class Node
{
public int Prop1 {get; set;}
public string Prop2 {get; set;}
public IEnumerable<Node> Children {get; set; }
private int _hash;
public override int GetHashCode()
{
if (_hash == 0)
{
_hash = 17;
_hash = _hash * 31 + Prop1.GetHashCode();
_hash = _hash * 31 + Prop2.GetHashCode();
foreach(var child in Children)
{
_hash = _hash * 31 + child.GetHasCode();
}
}
return _hash;
}
}
unit _hash = 0;
public override int GetHashCode()
{
// See code above
return (int)((_hash % 4294967295) - int.MaxValue);
}
或者有更好的方法来实现这一点吗?围绕您的代码来抑制整数类型算术运算和转换的溢出检查:
public override int GetHashCode()
{
unchecked
{
if (_hash == 0)
{
_hash = 17;
_hash = _hash * 31 + Prop1.GetHashCode();
_hash = _hash * 31 + Prop2.GetHashCode();
foreach(var child in Children)
{
_hash = _hash * 31 + child.GetHasCode();
}
}
return _hash;
}
}
将代码包围以抑制整型算术运算和转换的溢出检查:
public override int GetHashCode()
{
unchecked
{
if (_hash == 0)
{
_hash = 17;
_hash = _hash * 31 + Prop1.GetHashCode();
_hash = _hash * 31 + Prop2.GetHashCode();
foreach(var child in Children)
{
_hash = _hash * 31 + child.GetHasCode();
}
}
return _hash;
}
}
除了@Magnus awnser,您还可以在“构建>高级”下的项目属性中启用/禁用算术溢出检查。除了@Magnus awnser,您还可以在“构建>高级”下的项目属性中启用/禁用算术溢出检查。这是一个哈希函数,为什么不让它滚动呢?如果你不想滚动动作,你可以使用
uint
/ushort
。我想.NET溢出中的int类型默认是这样的?我不确定你想做什么,但是未选中的和选中的关键字看起来会引起人们的兴趣(还有)@CoryNelson,“在未检查的上下文中,溢出将被忽略,任何不适合目标类型的高阶位将被丢弃”(标准的其他部分暗示负整数是2的补码负,尽管它没有直接出来并这样说)这是一个散列函数,为什么不让它滚动呢?如果你不想滚动操作,你可以使用uint
/ushort
。我想.NET溢出中的int类型默认是这样的?我不确定你想做什么,但是未选中的和选中的关键字似乎会引起兴趣(和)@CoryNelson在“未经检查的上下文中,溢出被忽略,任何不适合目标类型的高阶位被丢弃”(标准的其他部分暗示负整数是2的补码负,尽管它没有直接出来并这样说)unchecked
是默认行为是c#尽管…它实际上是冗余的。谢谢。刚刚测试过它,int.MaxValue+1==int.MinValueunchecked
是默认行为是c#尽管…它实际上是冗余的。谢谢。刚刚测试过它,int.MaxValue+1==int.MinValue