namespace System.Collections.Generic
public List<T>
public void AddRange(IEnumerable<T> collection)
何かを返さないという意図的な設計上の決定のようです。AddRange が「流暢」であることを期待して、私はこれに悩まされました。
誰かがデザインの動機を知っているかどうか、もしあれば、何も返さないことに興味がありましたか?
namespace System.Collections.Generic
public List<T>
public void AddRange(IEnumerable<T> collection)
何かを返さないという意図的な設計上の決定のようです。AddRange が「流暢」であることを期待して、私はこれに悩まされました。
誰かがデザインの動機を知っているかどうか、もしあれば、何も返さないことに興味がありましたか?
このAddRange
メソッドは、LINQ が登場する前の .NET 2.0 で追加されたもので、「流暢さ」がまったく流行していなかった時代です。当時、誰AddRange
も何かを返すとは思っていませんでした。さらに、そのバージョンの .NET では List オブジェクトの初期化子がなかったため、多数の項目をリストに Add() する必要がありました。AddRange は、オブジェクトを 1 つずつループして追加する必要がないためのショートカットを提供しました。
同等の LINQ メソッドは次のとおりです。IEnumerable<T>.Concat()
他の答えは(本質的に)正しいですが、何かを返す理由の両方の可能性に対処するものはありません。 AddRange
これを行う理由の 1 つは、次のような流れるような API を作成することです。
list.Add(1).Add(2).Add(3);
list.AddRange(aGroupOfNumbers).AddRange(theNextGroupOfNumbers);
これを実現するために、リストは、リストを変更するメソッドの最後で単にそれ自体を返します。Trispedが指摘StringBuilder
しているように、ジェネリックList<T>
が導入される前にこれを行っていました。
何かを返すもう 1 つの理由は、Felix K. が暗示しているように、型が不変であることです。リストが不変の場合、それ自体を変更できないため、メソッドの最後でそれ自体を返すことはできません。また、void を返すことはできません。これは、それ自体を変更できないためです。メソッド コントラクトによって定義された変更を反映するために、リストは変更を組み込んだ新しいインスタンスを作成する必要があります。その後、もちろん、その新しいインスタンスを呼び出し元に返す必要があります。コレクションに関しては、人々はそれを理解するのに苦労することがありますが、このように動作する非常によく知られている型があります: System.String
. db が言うように、「古典的な」命令型プログラミング スタイルはデータ構造を変更するときに void メソッドを使用するため、リストが何かを返すとは誰も予想していませんでした。
名前空間の設計者は、System.Collections.Generic
自分たちの型に流暢な API を与えることを考えていなかったかもしれませんが、もしそうなら、彼らがそれに反対することをどのように決定したかを見ることができました. 確かに、StringBuilder の流れるような API の場合は、List<T>
.
リストは構造体ではないため、変更されます。変更を回避するリストが必要な場合は、独自に作成するか、Linqを使用するか、次のコードを使用する必要があります。
List<T> newList = new List<T>(originalList);
newList.AddRange(...);
または、(コンストラクターで)リストを作成するときにLinqを使用しますIEnumerable<T>.Concat()
。突然変異を避ける方法はたくさんあります。
このメソッドは、関数を呼び出したインスタンスにAddRange
追加collection
されます。List<T>
結果はすでにそこにあるので、結果として何も返す必要はありません。
実行する作業で新しいオブジェクトが作成されなかった場合、何も返されませんでした。頭に浮かぶ唯一の例外は、呼び出し元のインスタンスへのポインターを返すほとんどのメンバーメソッドが存在するStringBuilderクラスです。これはコマンドチェーンを有効にするためのものであり、ドキュメントに具体的に記載されています。