結論
メソッド引数の場合
基本的にはIEnumerableを利用。IEnumerableの方がメモリ効率が良いため。
List
- 要素数の取得をする
- foreach文を2回以上通過する
- 内部で配列やリストに変換している
メソッド戻り値
基本的にはListなどのより具体的なインタフェースで返す。呼び出し元での利便性を向上させるため。 無理にIEnumerableにしなくて良い。
詳細
基本的には以下の記事を参照。
IEnumerableは遅延評価がサポートされているため、「この変数は遅延評価に関する考慮が必要ですよ」というメッセージが込められることには注意。
ちなみにforeach文を2回以上通過する場合にイテレータが再評価される例は下記。
IEnumerable<int> GetNumbers() { List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; foreach (var number in numbers) { Console.WriteLine(number); yield return number; } } void Main() { var numbers = GetNumbers(); foreach (var number in numbers) { Console.WriteLine(number); } }
このメソッドを実行すると以下のように表示される。
1 1 2 2 3 3 4 4 5 5
このように同じ要素が複数回処理され、効率の低下や予期しない結果につながるので注意が必要。