2017-07-05 15 views
2

Enumerable.Repeat関数について質問があります。Enumerable.Repeat参照型オブジェクトの初期化

私はクラスがあります場合:

class A 
{ 
//code 
} 

そして私は、その型のオブジェクトの配列を作成します:

A [] arr = new A[50]; 

そして次、私が列挙を呼び出して、それらのオブジェクトを初期化したいと思うでしょう。繰り返し:

arr = Enumerable.Repeat(new A(), 50); 

これらのオブジェクトのメモリ内のアドレスは同じですか? 私はそのように例えば、彼らのハッシュコードをチェックしてみてください場合:

bool theSameHashCode = questions[0].GetHashCode() == questions[1].GetHashCode(); 

これが本当の私を返し、私は1つのオブジェクトのプロパティを変更する場合は、他のすべてのオブジェクトは、あまりにもそれを変更します。

私の質問です:それは正しく、参照型オブジェクトを初期化する方法ですか?そうでない場合は、より良い方法は何ですか?

答えて

6

Enumerable.Repeatを使用すると、この方法で1つのオブジェクトのみが初期化され、結果を反復処理するたびにそのオブジェクトが返されます。

これらのオブジェクトのメモリ内のアドレスは同じですか?

オブジェクトは1つのみです。あなたが望むものを達成するために

、あなたはこれを行うことができます。

Enumerable.Range(1, 50).Select(i => new A()).ToArray(); 

これはタイプAの50個の異なるオブジェクトの配列を返します。

ちなみに、GetHashCode()が同じ値を返すということは、オブジェクトが参考に等しい(または単純に等しい)ことを意味しません。 2つの非等しいオブジェクトは、同じハッシュコードを持つことができます。ただ、カミロのために明確にするのに役立つ

+0

これは奇妙です。私はEnumerable.Repeatを使用してオブジェクトを何十回もコピーします(手動で値をコピーする必要はありません)。次に、興味のあるプロパティを編集して、完璧に動作します。だから、あなたが "1つのオブジェクト"を意味するかどうかは分かりません –

+0

MSDNから: "1つの繰り返し値を含むシーケンスを生成します。" - おそらく、あなたは値の型を使っていたでしょう。その場合は、毎回コピーを取得します。 – Kapol

+0

いいえ、彼らはPOCOとネストされたクラスの両方を持つEFエンティティです –

2

は、ここに手で問題を示していくつかのテストコードは次のとおりです。

void Main() 
{ 
    var foos = Enumerable.Repeat(new Foo(), 2).ToArray(); 
    foos[0].Name = "Jack"; 
    foos[1].Name = "Jill"; 
    Console.WriteLine(foos[0].Name);  
} 

public class Foo 
{ 
    public string Name; 
} 

この版画「ジル」。つまり、Enumerable.Repeatは、Fooクラスのインスタンスを1つしか作成していないことを示しています。

+0

テストのためにありがとう。私はこれを行うコードを再訪する必要があります、私はおそらく何かについて忘れています –

+0

@CamiloTerevinto - 心配しないでください。私はちょうどこれが明らかにする価値があると思った。 – Enigmativity

関連する問題