代码之家  ›  专栏  ›  技术社区  ›  Faizan S.

返回新对象还是在构造函数中初始化成员?

  •  3
  • Faizan S.  · 技术社区  · 15 年前

    我们有一个数据提供程序类,它为数据库中的每个聚合返回存储库。

    让我们考虑以下场景:

    public class DataProvider {
        public IBookRepository Books { get { retun new BookRepository(); } }
        public IAuthorRepository Authors { get { retun new AuthorRepository(); } }
    }
    

    如您所见,每次调用成员时,我们都会返回给定对象的新实例: DataProvider.Books.DoBANANAS();

    VS

    public class DataProvider {
        public IBookRepository Books { get; }
        public IAuthorRepository Authors { get; }
    
        public DataProvider()
        {
            Books = new BookRepository();
            Authors = new AuthorRepository();
        }
    }
    

    现在对'dataprovider.books.bananas();的调用是否会减少CPU/内存的负担?

    当我开始执行这两个版本时,它们非常有效!

    但我的经验告诉我 Version 1 Sucks . 但我有足够的时间来充分优化和实现最终产品。(这是在研究小组工作的好处之一)

    2 回复  |  直到 15 年前
        1
  •  3
  •   adrianbanks    15 年前

    所示的实现在构造和管理对象的方式上是不同的。在第一个示例中,每次调用 DataProvider . 如果存储库持有任何状态(例如提取对象的缓存),您将得到与第二个示例非常不同的行为,因为每次都会将此状态重置为默认状态。

    从您所说的两个版本都可以工作的事实来看,我冒昧地猜测,存储库对象不保持状态,只是数据库调用的代理。在这种情况下,可能不会有太大的区别。

    然而 ,这两种方法的性能和内存配置文件非常不同。虽然过早的优化是一件坏事,而且常常是浪费时间,但我不会这样分类,因为在每次属性调用时创建一个新的存储库显然是以后的性能问题,或者更糟的是,如果将状态引入存储库,仍然会引入难以跟踪的错误。创建更少的对象将最终减少垃圾收集器的压力,但除非你正在创建数百万个对象,否则这将是一个微不足道的差异。

    总之,第二个例子是更好的,考虑到这一点,我现在没有看到真正的问题。

        2
  •  2
  •   Rob Goodwin    15 年前

    第一个示例每次都创建一个新的XXXRepository对象实例,第二个实例将句柄返回到已经存在的对象,因此第二个实例的性能应该更好,并且使用较少的CPU,因为不需要分配新内存。

    更大的问题是,除非存储库类完全是静态的或其他的,否则这两个场景会产生完全不同的结果。如果存储库类是某种到数据库的接口,那么选项1不需要是线程安全的,而选项2需要是线程安全的。