独自の ID によっても識別される Entity Framework オブジェクトがいくつかあります。
特に DB にまだないオブジェクトの場合は、おそらくより信頼性の高い参照比較を使用することを好みます。
Int32 ID 比較とByRef オブジェクト比較のパフォーマンスの違いはどれですか?
独自の ID によっても識別される Entity Framework オブジェクトがいくつかあります。
特に DB にまだないオブジェクトの場合は、おそらくより信頼性の高い参照比較を使用することを好みます。
Int32 ID 比較とByRef オブジェクト比較のパフォーマンスの違いはどれですか?
参照の比較と参照の比較のパフォーマンスはint
ほぼ同じになります。比較には、スタックで追加のID
プロパティ アクセス呼び出しが必要です。ただし、この 2 つのパフォーマンスの違いはごくわずかです。
ただし、これは、平等を判断する方法に関する決定要因であってはなりません。等しいかどうかは、オブジェクトが表すものに基づいて決定する必要があります。オブジェクトがそのプロパティによって定義されている場合、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");
}
この場合、2 つのオブジェクトは実際には同じ人物を参照している可能性があります。JaneJaneSmith
が結婚して名前を変更する前に作成され、キャッシュされた可能性があります。しかし、彼女の名前が変わったので、値と参照の両方の比較が失敗します。ただし、ID の等価性を使用する場合は、同じ人 (および同じデータ ソース) を参照していることがわかるため、これで問題ありません。次に、両方のインスタンスを破棄し、データベースからwithLady
をリロードすることで、どちらのインスタンスが現在正しいかを解決できます。対照的に、参照の等価性または値の等価性のいずれかを使用していた場合、両方のオブジェクトを保存することになり、間違ったデータを上書きする可能性があります。また、両方のインスタンスのデータが同一で、誤ってロードしたためにインスタンスが 2 つしかなかったとしても、Lady
ID == 12
JaneSmith
データベースから 2 回アクセスすると、参照の等価性チェックで false が返されます。new Lady(12,"Jane").Equals(new Lady(12,"Jane"))
がfalse を返すのは正しくないようです。また、レコードがキャッシュされているかどうかを判断できないため、キャッシュは事実上不可能になります。
一般に、参照の等価性を使用して永続オブジェクトを比較することは、悪い考えです。ただし、ID
平等が常に適切であるとは限りません。どちらも価値の平等ではありません。両方の場合があり、操作しているデータを最もよく表しているものを決定する必要があります。詳細については、この記事で「エンティティ」と「値オブジェクト」の違いに関する非常に基本的な概念 (ドメイン駆動設計方法論の概念) を説明します。