当属性有一些集合类型时
public IList<MyItemClass> MyList{ get; }
恕我直言,最好返回空集合而不是空值。
有许多方法可以实现此类功能。
public IList<MyItemClass> MyList{ get; private set; }
public MyClass(){
MyList = new List<MyItemClass>();
}
这种方式允许减少类字段的数量,但是您需要在每个构造函数中放置代码。
private List<MyItemClass> _myList = new List<MyItemClass>();
public IList<MyItemClass> MyList{ get{ return _myList; } }
这是标准方式。但是,当有人在您的代码中写入某些内容时,他可以使用私有(private)字段而不是属性,并且当您重构 get action 时,您可能会遇到一些错误。
private List<MyItemClass> _myList;
public IList<MyItemClass> MyList{ get{ return _myList??(_myList = new List<MyItemClass>()); } }
这是之前延迟加载方式的变体。
您希望返回什么作为集合的默认值?如果这是一个空集合,你如何实现它?
最佳答案
Do provide sensible default values for all properties, ensuring that the defaults do not result in a security hole or an extremely inefficient design.
扩展此原则并将其与 Principle of Least Surprise 相结合应该非常清楚,您应该始终返回一个空集合而不是 null。
既然可以提供合理、直观的默认值,为什么还要让调用者承担检查 null 的负担?
封装的全部要点是在单个地方完成工作。它可能会使特定类的实现更复杂一些,但会使其 API 的使用更简单。
在大多数情况下,我将集合实现为包含类型的不变量:
public class MyClass
{
private readonly List<Foo> foos;
public class MyClass()
{
this.foos = new List<Foo>();
}
}
注意 readonly
关键字的使用,它确保一旦设置,列表就永远不能被替换或清空(但它仍然可以被重置)。这将列表作为类的不变量进行保护,从而避免在我的其余代码中编写空检查。
延迟加载也是一种有效的编码习惯用法,但我只在明确需要时才使用它。
关于c# - 集合类型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2295344/