Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带一个字段(即整数)的结构-是否仍需要重写GetHashCode、Equals等?_C#_Performance_Struct_Hashset_Gethashcode - Fatal编程技术网

C# 带一个字段(即整数)的结构-是否仍需要重写GetHashCode、Equals等?

C# 带一个字段(即整数)的结构-是否仍需要重写GetHashCode、Equals等?,c#,performance,struct,hashset,gethashcode,C#,Performance,Struct,Hashset,Gethashcode,通常,当有人谈论结构时,建议您重写Equals,GetHashCode,等等 如果您有一个只有一个整数(或任何其他简单值类型)的struct,这是否也是必需的 比如说: public struct LolCatId { public int Id { get; } public LolCatId(int id) { Id = id; } } 在hashsetetc中使用时-是否需要考虑任何事情,或者在所有情况下,它是否都能完美地发挥预期的性能?

通常,当有人谈论结构时,建议您重写
Equals
GetHashCode
,等等

如果您有一个只有一个整数(或任何其他简单值类型)的
struct
,这是否也是必需的

比如说:

public struct LolCatId
{
    public int Id { get; }

    public LolCatId(int id)
    {
        Id = id;
    }
}
hashset
etc中使用时-是否需要考虑任何事情,或者在所有情况下,它是否都能完美地发挥预期的性能?

您应该更好地覆盖
Equals
GetHashCode
,因为值类型的默认等式成员通常是基于反射的(这就是为什么可能很慢的原因)

一些默认的
Equals
实现非常奇怪,例如:

结果:

Are structs equal? No
Are fields equal?  Yes
详情请参阅

为了安全起见,尤其是当两种方法都可以轻松实现时,例如在您的情况下:

public struct LolCatId {
  public int Id { get; }

  public LolCatId(int id) {
    Id = id;
  }

  public override int GetHashCode() => Id;

  public override bool Equals(object obj) => 
    obj is LolCatId other ? other.Id == Id : false;
}

是的,你最好覆盖@DmitryBychenko:让它成为一个答案。这是一个很好的资源。您可以执行
public override int-GetHashCode()=>Id.GetHashCode()。。。
Are structs equal? No
Are fields equal?  Yes
public struct LolCatId {
  public int Id { get; }

  public LolCatId(int id) {
    Id = id;
  }

  public override int GetHashCode() => Id;

  public override bool Equals(object obj) => 
    obj is LolCatId other ? other.Id == Id : false;
}