gpt4 book ai didi

c# - 在构造函数中返回一个新对象或初始化成员?

转载 作者:行者123 更新时间:2023-11-30 15:10:38 26 4
gpt4 key购买 nike

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

让我们考虑以下场景:

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

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

对比

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 .然而,我有足够的时间来全面优化和实现最终产品。 (这是在研究小组工作的好处之一)

最佳答案

显示的实现在构造和管理对象的方式上有所不同。在第一个示例中,每次在 DataProvider 上调用该属性时都会创建一个新的存储库。如果存储库保存任何状态(例如,获取对象的缓存),您将获得与第二个示例截然不同的行为,因为每次都会将此状态重置为其默认值。

根据您所说的两个版本都有效的事实,我猜测存储库对象不保存状态,只是数据库调用的代理。在这种情况下,它可能不会有太大区别。

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

总而言之,第二个示例是 future 更好的示例,我现在认为没有真正的问题。

关于c# - 在构造函数中返回一个新对象或初始化成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3065955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com