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;
}