受け入れられません:列挙可能vsリスト

私は以前、そのようなコードをデバッグするのが難しいと思われるためにLINQが少し嫌われていたチームで働いていました。合意がありました。各LINQチェーンの後で、開発者はToArray()の結果を書き込むローカル変数を作成します。配列がメソッドのさらに下で必要かどうか、またはIEnumerableでのみ機能するかどうかに関係なく。戻る前に、結果も配列にキャストされました。コードベース全体に、配列以外のコレクションを返すまたは受け入れるメソッドがなかったようです。

ひげを生やしたレガシー!-あなたは考え、あなたは正しいでしょう。ただし、LINQが普及してから何年も経過し、IDEを使用してデバッグでデータを表示できるようになったにもかかわらず、コレクションに関しては、受け入れタイプと戻りタイプを選択するための基準についてよく理解していない開発者もいます。

まず、コレクションとは何ですか?BCLには同じ名前のデータタイプがあるため、コレクションは、いくつかの共通の特性(データタイプ)を持つアイテムのグループを操作するように設計されたデータタイプであることを理解することが重要です。したがって、列挙できるものはすべてコレクションです。

抽象化を優先する

, , . , . ,   . , , .

Lazy loading

- (  IEnumerable)  , .  IList, , .   ,  lazy loading, — . . , 'Lazy' , , .

IReadOnlyCollection

, ,  IArray, IReadOnlyCollection,  -. 

namespace System.Collections.Generic 
{ 
  public interface IReadOnlyCollection : IEnumerable, IEnumerable 
  { 
    int Count { get; } 
  }
}

 -  4.5,  read-only . Array, List,  IList.

 IEnumerable  … ,  IReadOnlyCollection,       List. , -   List.

 Array  IReadOnlyCollection  List, .  IList    .

null

,  ,  ,  , ,  , ,  null.  null, .  - null  0 . 1  null,  null, ,  . :

 if(myEnumerable != null) 
 { 
   foreach(var item in myEnumerable) 
   { 
   } 
 }  

,   :

foreach(var item in myEnumerable ?? Enumerable.Empty<T>()) 
{
}

IEnumerable/ICollection/IList

, , :

IEnumerable

, -,

IReadOnlyCollection : IEnumerable

-,

ICollection : IEnumerable

, (IsReadOnly)

IReadOnlyList : IReadOnlyCollection

,

IList : ICollection

,

, , . , . IEnumerable , - ICollection, IList…   .

, , , . , , IReadOnlyCollection. IEnumerable , , , — -. lazy loading, IList ICollection, —  read-only .

Web API HTTP

HTTP, , -. , , , IEnumerable IList.

, HTTP JSON -  , . , (Newtonsoft.Json, System.Text.Json), List. \ - . IEnumerable response .


, , , , .

修正や追加をいただければ幸いですコレクションのフレームワーク設計ガイドラインをよく理解しておくことをお勧めします




All Articles