2

深いコピーと浅いコピーに関する私の理解が正しければ、私の質問は不可能です。配列 (a[10]) があり、浅いコピー (b[20]) を実行する場合、b のデータが連続していないため、これは不可能ではないでしょうか?

私がこれを完全に間違っている場合、配列のサイズを変更するために再割り当てを行うc ++の機能を(c#で)模倣する迅速な方法を誰かがアドバイスできます。


System.Array オブジェクトの .Clone() および .Copy() メンバーを見ています。

4

1 に答える 1

4

既存の配列のサイズを変更することはできませんが、次を使用できます。

Array.Resize(ref arr, newSize);

これにより、新しい配列が割り当てられ、データが古い配列から新しい配列にコピーされ、arr変数が更新されます (この場合は参照によって渡されます)。そうですか?

ただし、古い配列を指している他の参照は更新されません。より良いオプションは、使用するList<T>ことです。手動でサイズを変更する必要はなく、古い参照の問題もありません。Add/などだけですRemove。通常、配列を直接使用することはあまりありません。それらには用途がありますが、デフォルトのケースではありません。


あなたのコメントを再;

  • ボクシング: ボクシングList<T>しません。これは、ジェネリックに関するポイントの 1 つです。ボンネットの下にList<T>はラッパーがありT[]、 aにはボクシングList<int>がありません。int[]古いArrayListものは のラッパーobject[]であるため、ボックスを実行します。もちろん、ボクシングはあなたが思っているほど悪くはありません。
  • の仕組みArray.Resize; 私が思い出すと、それは のサイズを見つけてから、コンテンツをブリットするためTに使用Buffer.BlockCopyします。実際の詳細は内部呼び出しによって隠されていますが、基本的に新しい配列を割り当てた後は、2 つの配列間のデータのブリット (memcpy) であるため、かなり速いはずです。参照型の場合、これはヒープ上のオブジェクトではなく、参照のみをコピーすることに注意してください。ただし、定期的にサイズ変更を行っている場合は、通常、はるかに簡単になります (また、サイズ変更の回数を最小限に抑えるために予備の容量を再List<T>実装しない限り、より迅速になります)。List<T>
于 2009-01-11T10:08:17.223 に答える