![](/img/trans.png)
[英]how to implement override of GetHashCode() with logic of overriden Equals()
[英]How to implement the override methods of Equals and GetHashCode in a class that implements IProxyGenerationHook in Castle.Core?
閱讀 Castle.Core 文檔,在此鏈接中,他們建議始終覆蓋實現IProxyGenerationHook
的類的Equals
和GetHashCode
方法。
我有一個名為MiHook
的 class 實現了這樣的接口,但是這個 class 沒有 state。所以,我的問題是,如果我有一個無狀態的 class,我應該如何覆蓋這兩個方法?
public class MiHook : IProxyGenerationHook {
public void MethodsInspected() { }
public void NonProxyableMemberNotification(Type type, MemberInfo memberInfo) { }
public bool ShouldInterceptMethod(Type type, MethodInfo methodInfo) {
return methodInfo.Name == nameof(IFoo.Bar);
}
// Should I implement both methods like this?
public override bool Equals(object? obj) => base.Equals(obj);
public override int GetHashCode() => base.GetHashCode();
}
我不確定無狀態 class 是什么意思 - 您是說它沒有任何字段嗎? 什么是無狀態 class?
您示例中的基本實現與根本不覆蓋一樣好。 你需要問自己一個問題:
什么使 MiHook 類型的兩個對象相等?
從您對ShouldInterceptMethod
的實施來看,它是類型( IFoo.Bar
)。 如果是這樣的話,我會 go 一個IFoo.Bar
- “依賴”覆蓋:
public class MiHook : IProxyGenerationHook
{
public void MethodsInspected() { }
public void NonProxyableMemberNotification(Type type, MemberInfo memberInfo) { }
public bool ShouldInterceptMethod(Type type, MethodInfo methodInfo)
{
return methodInfo.Name == nameof(IFoo.Bar);
}
public override bool Equals(object obj)
{
if (obj == null || obj.GetType() != this.GetType()) return false;
return obj.GetHashCode() == this.GetHashCode();
}
public override int GetHashCode() => typeof(IFoo.Bar).GetHashCode();
}
測試它:
var mh1 = new MiHook<Foo.Bar>();
var mh2 = new MiHook<Foo.Bar>();
Console.WriteLine(mh1.Equals(mh2)); //True
//your implementation returns False
在 Glimpse 項目中,IProxyGenerationHook 也被覆蓋。 盡管他們仍然有一個私有字段用於覆蓋 GetHashCode 和 Equals:
private IEnumerable<IAlternateMethod> methodImplementations;
這是包含方法 GetHashCode 和 Equals 的源文件的鏈接。
也許它是有用的靈感來源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.