2016-03-28 10 views
0

これは私を困惑させました。次のコンストラクタは新しいSectorインスタンスを作成しますが、array1またはarray2の値を変更すると、両方の値が変更されます。奇妙なC#の動作。 1つの値を設定すると2つに影響があります

public Sector (Vector3[] vertices) 
    { 
     Vector3[] array1 = vertices; 
     Vector3[] array2 = vertices; 

     array1 [0].X = 0; 
     array2 [0].X = 1; 

     Console.WriteLine (array1 [0].X); 
     Console.WriteLine (array2 [0].X); 
    } 

出力は、これはC#言語の意図的な部分の両方の配列

1 
1 

ための1ですか?代替手段は何ですか?

+5

をあなただけ* 1 *の配列を持っています。複数の変数名で参照していますが、メモリには* 1の配列しかありません。 – David

+2

配列1と配列2が同じ配列を指しています。頂点は – Eser

+0

です。 'array1'と' array2'は同じオブジェクト( 'vertices')を指しています。したがって、最後の代入 'array2 [0] .X = 1;'は 'vertices'配列を直接変更し、前の行の変更を上書きします。 –

答えて

4

配列は参照であるため、array1 = verticesを呼び出すと値はコピーされず、同じオブジェクトを参照するように設定されます。したがって、配列は1つしかありません。

次の2つが必要な場合は、例えば、配列を複製:

Vector3[] array1 = vertices.ToArray(); //ToArray duplicates the contents as an array 
Vector3[] array2 = vertices.ToArray(); 
+1

または['Array.Copy()']](https://msdn.microsoft.com/en-us/library/system.array.copy(v = vs.110).aspx)を参照してください。 –

+0

OpenTK Vector3クラスにはこのような機能はありませんが、今問題がわかりました。 –

1

上記で参照している両方の配列は、単純に頂点配列への参照です。したがって、いずれかの配列を変更すると、頂点配列が変更されます。

この問題を回避するには、頂点配列を複製する必要があります。

関連する問題