それらは完全に同等ではありません。
最初のケースでは、新しい配列を作成し、それをコンストラクターに渡します。List<T>コンストラクターは、同じサイズの独自の内部配列を作成し、ソース配列のメソッドを呼び出して、ソース配列CopyToからアイテムを内部配列にコピーします。
List<T>2 番目のケースでは、最初は空の配列 ( size ) を使用して new を作成し_defaultCapacity = 4、次に List のAddメソッドを呼び出します。これにより、要素を追加するときに内部配列のサイズが数回変更される可能性があります。
CopyToしたがって、最初のケースでは、 List の内部配列のサイズを変更する必要がないこと、およびiterative ではなく潜在的に効率的なメソッドを呼び出すことでメリットが得られAddますが、メモリ内に一度に 2 つの配列を作成する必要があります。
2 つの配列の作成を回避し、リストの内部配列のサイズを変更しないようにするためにできることの 1 つを次に示します。
var aList = new List<string>(3) { "elem1", "elem2", "elem3" };
マジック定数 があるため、プロダクション コードには必ずしもこれをお勧めしません3が、とにかく、他の 3 つのマジック定数が既に存在します。