2017-05-20 21 views
0

私はいくつかの座標を含む読み取り専用リストを持っています。以下の方法で読み取り専用リスト自体をオーバーライドします

private readonly List<float[]> rightPositions = new List<float[]>() 
{ 
    new float[2] { 250, 0 }, 
    new float[2] { 350, -200 }, 
    new float[2] { 350, 200 }, 
    new float[2] { 600, 0 } 
}; 

IフィールドrTeam.PlayerArray[iterator].PositionList<float[]> rightPositionsから静的データを与えます。

private void ClearPlayers(Team rTeam, Team lTeam) 
    { 
     for (int iterator = 0; iterator < rTeam.PlayerArray.Length; iterator++) 
     { 
      rTeam.PlayerArray[iterator].Position = rightPositions.ElementAt(iterator); 
     } 
    } 

ClearPlayers(Team rTeam, Team lTeam)が実行される最初の時間は、List<float[]> rightPositionsからのデータはrTeam.PlayerArray[iterator].Positionに入れています。最初の後、読み取り専用のデータList<float[]> rightPositionsは以前と同じではありません。

わかりやすかったですか?あるいは、私はreadonlyフィールドよりも何かを使う必要がありますか?

ありがとうございます。

+0

@pokeこの場合、完全な複製ではありません。 * list *が不変であっても、オブジェクトは内部ではありません。それは問題ではありません。 –

答えて

0

readonlyは、「この変数の値を変更することはできません。リスト内にあるものは変更できますが、新しいリストを作成することはできません。

また、実際のコンテンツの仕組みも変更されません。浮動小数点配列を作成し、それらをどこかに割り当てると、それらはまだ同じ配列を指しているので、それらの変更はこのリストの配列に影響します。

アレイを変更しないようにするには、アレイのクローンを作成する必要があります。私はPositionはXを有し、Yは、XとYとのstructを有することがより論理的であろうと、データをコピーし、それを変更しないであろう割り当てる座標と仮定ため

rTeam.PlayerArray[iterator].Position = (float[])rightPositions.ElementAt(iterator).Clone(); 

別の方法は、struct Sを使用することであろうソースの途中でまた、コードをより明確にする可能性もあります。

0

Listは読み取り専用ではありません。 Listは読み取り専用ではありません。それは読み取り専用のプロパティです。つまり、異なるListオブジェクトをそのプロパティに割り当てることはできませんが、一度Listオブジェクトをプロパティから取得すると、それは他のListと同じようになり、好きなように変更できます。コレクションを読み取り専用にする場合は、ListではなくReadOnlyCollectionを使用してください。