c# - 集合类型的属性

标签 c# collections properties ienumerable

当属性有一些集合类型时

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>()); } }

这是之前延迟加载方式的变体。

您希望返回什么作为集合的默认值?如果这是一个空集合,你如何实现它?

最佳答案

来自.NET Design Guidelines :

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/

相关文章:

java - 由于 Property 类中的 NoSuchMethodError 导致 Spring BeanCreationException

c# - DirectoryInfo.GetFiles() 不返回所有文件

c# - 从后台线程更新时 UI 稍微卡住

java - 通过Java Stream实现多个集合的笛卡尔积

java - 如何将 ArrayList 传递给以集合作为输入的方法

javascript - 如何检查对象的 javascript 数组是否列出了每个属性?

c# - 使用 GetPixel() 查找彩色区域的最大宽度和最大高度相交的像素

c# 依赖注入(inject)与接口(interface)和隐藏内部

collections - Plone 4 : How to retrieve the item category/tags/keywords inside a page template

php - 使用节点的字符串表示形式访问 stdClass 对象上的嵌套属性