C# 是否存在将角色返回到−;2147483648是否溢出?

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

我正在实现一个对象树。此树中的每个类都有一些属性和一个GetHashCode()方法。我计划做的是组合所有属性的散列,然后将该散列与子节点的散列组合。我现在不在Visual Studio前面,但代码如下所示:

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.MinValue
unchecked
是默认行为是c#尽管…它实际上是冗余的。谢谢。刚刚测试过它,int.MaxValue+1==int.MinValue