我有一些實體框架對象,這些對象也是由它們自己的ID標識的。ID比較與參考比較
我更喜歡使用可能更可靠的參考比較,特別是對於不在數據庫上的對象。
Int32 ID比較和ByRef對象比較在性能方面的差距是多少?
我有一些實體框架對象,這些對象也是由它們自己的ID標識的。ID比較與參考比較
我更喜歡使用可能更可靠的參考比較,特別是對於不在數據庫上的對象。
Int32 ID比較和ByRef對象比較在性能方面的差距是多少?
比較參考和比較int
的性能大致相同。 ID
比較需要在堆棧上進行附加屬性訪問調用。但是,兩者之間的性能差異可以忽略不計。
但是,這不應該成爲您如何確定平等的決定性因素。平等應該根據對象的表現來確定。如果該對象由其ID
屬性定義,則應使用ID
屬性確定相等性。如果對象是通過其值的組合來定義的,那麼您應該通過比較每個組件值來確定相等性。
爲了更好地理解我在說什麼,考慮下面的類爲例:
public class Lady {
public Lady(int id, string name, bool isMarried){
this.ID = id;
this.Name = name;
}
public int ID { get; private set; }
public string Name { get; set; }
public override int Equals(object other){ /* What goes here? */ }
public override int GetHashCode(){ /* What goes here? */ }
}
試想一下,你的應用程序使用的Lady
類,如:
void Main(){
var JaneSmith = new Lady(id:12,name:"Jane Smith");
var JaneSmithJones = new Lady(id:12,name:"Jane Smith-Jones");
}
在這種情況下, ,這兩個對象可能實際上是指同一個人。也許JaneSmith
在簡結婚之前創建並緩存,並且更改了她的名字。但是,現在她的名字已經改變,現在價值和參考比較都會失敗。但是,如果我們使用ID平等,那麼這是可以的,因爲我們會知道他們應該引用同一個人(和同一個數據源)。然後,我們可以通過放棄這兩個實例並從數據庫中重新加載和ID == 12
來解決哪個實例當前正確。相比之下,如果我們使用引用相等或值相等,我們最終會保存這兩個對象,可能會覆蓋錯誤的數據。此外,即使兩個實例中的數據都相同,並且我們只有兩個實例,因爲我們不小心從數據庫中加載了兩次JaneSmith
,引用相等性檢查將返回false。這似乎不太正確,new Lady(12,"Jane").Equals(new Lady(12,"Jane"))
應該返回false。它也使緩存幾乎不可能,因爲你永遠不能確定一條記錄是否已被緩存。
一般來說,使用引用相等也比較持久對象是一個壞主意。但是,ID
平等並不總是合適的。價值平等也不是。有兩種情況,你必須決定什麼最能代表你正在操作的數據。有關這方面的更多信息,this article提供了「實體」和「值對象」(來自域驅動設計方法的概念)之間差異的一個非常基本的概念。
擔心這種性能差異聽起來像不成熟的優化 - 它是不可能有任何實際的區別。 –
這取決於。在該引用結尾處訪問數據是否會導致緩存未命中,否則將不存在?如果不是,不管它。如果確實如此,請將其剖析並可能仍然無視它。 – harold
沒有緩存未命中是可能的。從DB加載記錄時,其所有字段都被填充。所以謝謝 :) – Teejay