2012-10-01 132 views
1

我有一些實體框架對象,這些對象也是由它們自己的ID標識的。ID比較與參考比較

我更喜歡使用可能更可靠的參考比較,特別是對於不在數據庫上的對象。

Int32 ID比較ByRef對象比較在性能方面的差距是多少?

+1

擔心這種性能差異聽起來像不成熟的優化 - 它是不可能有任何實際的區別。 –

+1

這取決於。在該引用結尾處訪問數據是否會導致緩存未命中,否則將不存在?如果不是,不管它。如果確實如此,請將其剖析並可能仍然無視它。 – harold

+0

沒有緩存未命中是可能的。從DB加載記錄時,其所有字段都被填充。所以謝謝 :) – Teejay

回答

1

比較參考和比較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提供了「實體」和「值對象」(來自域驅動設計方法的概念)之間差異的一個非常基本的概念。