我曾经在一个团队中工作过,而LINQ却被稍微讨厌,因为据说很难调试这种代码。我们有一个协议:在每个LINQ链之后,开发人员创建一个局部变量,他将ToArray()的结果写入该局部变量。是否需要在方法的更下层使用数组,或者仅与IEnumerable一起使用。在返回之前,结果也被强制转换为数组,似乎整个代码库中没有除数组之外的其他返回或接受集合的方法。
大胡子的遗产!-你会想,你会是对的。但是,尽管自LINQ普及以来已经过去了很多年,并且IDE允许您在调试中查看数据,但一些开发人员对收集时选择接受和返回类型的标准仍然不甚了解。
首先,集合是什么?由于BCL具有相同名称的数据类型,因此重要的是要了解集合是一种旨在对具有某些共同特征的一组项目(数据类型)进行操作的数据类型。因此,任何可以枚举的都是集合。
偏好抽象
无论您是返回还是接收数据,使用抽象都更加方便。通过仅提供所需的成员,您可以控制对对象的访问。您还可以毫不费力地更改实现,而无需破坏用于处理参数或返回值的现有代码。当标准接口的功能不够时,返回特定类型是有意义的,突出显示特定类型也没有意义。
延迟加载
- ( 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 .
, , , , .