c# - 在一个对象中初始化一个集合?

标签 c# .net oop

如果一个对象有一个集合属性,该对象应该创建集合对象还是让消费者检查是否为空?我知道消费者不应该假设,只是想知道是否大多数人创建了集合对象,如果它从未被添加到。

最佳答案

您还可以使用“Lazy initailizer”模式,其中直到(并且除非)有人访问它的属性 getter 才初始化集合......这避免了在实例化父对象的情况下创建它的开销用于不需要收集的其他一些目的......

   public class Division
    {
        private int divId;
        public int DivisionId { get; set; }

        private Collection<Employee> emps;
        public Collection<Employee> Employees
        { get {return emps?? (emps = new Collection<Employee>(DivisionId));}} 
    }

编辑:一般而言,此实现模式不是线程安全的...在第一个线程完成修改之前,两个不同的线程可以将 emps 读取为 null。在这种情况下,这可能无关紧要,因为 DivisionId 是不可变的,尽管两个线程将获得不同的集合,但它们都是有效的。因此,当第二个线程结束时,emps 将是一个有效的集合。 “可能”是因为第一个线程可能会在第二个线程重置它之前开始使用 emps。那不是线程安全的。 Jon SKeet 的另一个稍微复杂的实现是线程安全的(参见 This article on SIngletons 他的示例/关于如何解决这个问题的讨论。

关于c# - 在一个对象中初始化一个集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/350502/

相关文章:

c# - 根据方法参数生成唯一的缓存键

java - 为子类设置父类(super class)属性

javascript - JavaScript 中的原型(prototype)继承是否表现出类型多态性?

c# - 从 C# 中的 Excel 工作表中读取数据?

c# - 对两个List<>的操作

c# - 字符串格式不起作用

.net - host.json 中的 Azure Function 日志级别是否会覆盖 appsettings-file 日志级别和应用程序洞察日志级别?

.net - Socket.Receive 在收到所有数据之前不会阻塞

javascript - Javascript 中的原型(prototype)继承 使用基本但不复杂的程序

c# - 如何将 PayPal 浏览器登录集成到 Visual Studio 集成测试中?