方法有來自NHibernate
文檔一段話:Implemeting GetHashCode的,等於爲ValueObjects
注:如果定義複合元素的
ISet
,它實現Equals()
和GetHashCode()
正確是非常重要的。
correctly
是什麼意思?是否需要爲域中的所有值對象實現這些方法?
延長我的問題
在文章馬克連接用戶白漿狀態:
它實際上很難正確地實現
GetHashCode()
,因爲,除了規則的馬克已經提到,哈希代碼不應該在對象的生命週期中更改。因此,用於計算哈希代碼的字段必須是不可變的。當我使用
NHibernate
時,終於找到了解決此問題的解決方案。我的方法是從對象的ID中計算哈希碼。 ID只能通過構造函數設置,所以如果你想改變ID,這是不太可能的,你必須創建一個新的對象,它有一個新的ID,因此一個新的哈希碼。這種方法最適合於GUID,因爲您可以提供一個隨機生成ID的無參數構造函數。
我突然意識到我有我的AbstractEntity
類中:
public abstract class AbstractEntity<T> where T : AbstractEntity<T> {
private Nullable<Int32> hashCode;
public virtual Guid Id { get; protected set; }
public virtual Byte[] Version { get; set; }
public override Boolean Equals(Object obj) {
var other = obj as T;
if(other == null) {
return false;
}
var thisIsNew = Equals(this.Id, Guid.Empty);
var otherIsNew = Equals(other.Id, Guid.Empty);
if(thisIsNew && otherIsNew) {
return ReferenceEquals(this, other);
}
return this.Id.Equals(other.Id);
} // public override Boolean Equals(Object obj) {
public override Int32 GetHashCode() {
if(this.hashCode.HasValue) {
return this.hashCode.Value;
}
var thisIsNew = Equals(this.Id, Guid.Empty);
if(thisIsNew) {
this.hashCode = base.GetHashCode();
return this.hashCode.Value;
}
return this.Id.GetHashCode();
} // public override Int32 GetHashCode() {
public static Boolean operator ==(AbstractEntity<T> l, AbstractEntity<T> r) {
return Equals(l, r);
}
public static Boolean operator !=(AbstractEntity<T> l, AbstractEntity<T> r) {
return !Equals(l, r);
}
} // public abstract class AbstractEntity<T>...
由於所有components
嵌套在entities
我應該然後實現Equals()
和GetHashCode()
又在哪裏?
相關:http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals-method-is-overridden?rq=1 – 2013-04-11 11:17:33