Ste*_*eck 8 c# collections ienumerable properties
当属性有一些类似的集合类型时
public IList<MyItemClass> MyList{ get; }
Run Code Online (Sandbox Code Playgroud)
恕我直言,最好返回空集合而不是空值.
有许多方法可以实现此类功能.
public IList<MyItemClass> MyList{ get; private set; }
public MyClass(){
MyList = new List<MyItemClass>();
}
Run Code Online (Sandbox Code Playgroud)
这种方式允许减少类字段的数量,但是您需要在每个构造函数中放置代码.
private List<MyItemClass> _myList = new List<MyItemClass>();
public IList<MyItemClass> MyList{ get{ return _myList; } }
Run Code Online (Sandbox Code Playgroud)
这是标准方式.但是当有人在你的代码中写一些东西时,他可以使用私有字段而不是属性,当你重构动作时你可以得到一些错误.
private List<MyItemClass> _myList;
public IList<MyItemClass> MyList{ get{ return _myList??(_myList = new List<MyItemClass>()); } }
Run Code Online (Sandbox Code Playgroud)
这是延迟加载的前一种方式的变体.
您更喜欢将哪些内容作为收集的默认值返回?如果这是空集合你如何实现它?
来自.NET 设计指南:
请为所有属性提供合理的默认值,确保默认值不会导致安全漏洞或极其低效的设计。
扩展这一原则并将其与最小意外原则相结合应该会非常清楚地表明您应该始终返回一个空集合而不是 null。
当您可以提供合理、直观的默认值时,为什么要把检查 null 的负担交给调用者呢?
封装的重点是在一个地方完成工作。它可能会使特定类的实现变得更加复杂,但它使得使用其 API 变得更加简单。
在大多数情况下,我将集合实现为包含类型中的不变量:
public class MyClass
{
private readonly List<Foo> foos;
public class MyClass()
{
this.foos = new List<Foo>();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意关键字的使用readonly,它确保一旦设置,列表就永远不会被替换或清空(但仍然可以重置)。这将列表保护为类的不变量,这使我免于在代码的其余部分中编写空检查。
延迟加载也是一种有效的编码习惯,但我仅在明确需要时才使用它。
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |