LINQとLambdaクエリーの結果について質問があります。たとえば、次のコードがあります。LINQとLambdaクエリーについての質問
class ClassA<T> {
public string Name { get; set; }
public T ObjectT { get; set; }
}
List<ClassA<T>> list;
// list is populated
// First way to get instance from list, reference type?
ClassA<T> instance1 = list.Select(x=> x).Where(x=>x.Name == "A").
FirstOrDefault();
// Second way to clone or copy instance from the list
ClassA<T> instance2 = list.Select(x=>
new ClassA<T> { Name = x.Name, ObjectT = x.ObjectT}).
Where(x=> x.Name = "A").FirstOrDefault();
明らかに、instance2はlistにあるインスタンスのクローンまたはコピーです。インスタンス1はどうですか?これは新しいインスタンスか、リスト内のインスタンスへの参照ですか? instance1がリスト項目のオブジェクト参照である場合、そのプロパティの変更によってリスト内の同じオブジェクトが変更されることがあります。そうですか?
この場合、リスト内のオブジェクトに暗黙の影響を与えたくないので、2番目の戦略を使用する必要があります。しかし、検索されたインスタンスの変更にもリスト内で同じ変更が必要な場合は、戦略1を使用する必要があります。自分の理解が正しいかどうかはわかりません。コメントはありますか?
私はこの方法が推奨されると思う、私はwaffledとnullを伝播する拡張メソッドに変更されました。 – Jimmy
実際、拡張方法にはこの利点があります。実際には、任意の 'ICloneable'クラスを拡張することさえできます。 – jpbochi