C# 在哪里加载对象中的初始数据?

标签 c# winforms

类似这个问题: C# Constructor Design但这个问题略有不同。

我有一个类 Customer 和一个类 CustomerManager。当创建 CustomerManager 类的实例时,我想加载所有客户。这就是我被困的地方。我可以通过几种方式做到这一点:

  1. 在构造函数中加载所有客户(我不喜欢这个,因为如果我有很多客户,它可能需要一段时间)
  2. 在执行数据库相关操作的 CustomerManager 类的每个方法中,检查本地客户列表是否已加载,如果没有,则加载列表:

    public method FindCustomer(int id)
    {
      if(_customers == null)
      // some code which will load the customers list
    }
    
  3. 创建一个加载所有客户的方法。必须在调用执行数据库相关操作的方法之前调用此方法:

    在类里面:

    public LoadData()
    {
       // some code which will load the customers list
    }
    

    形式:

    CustomerManager manager = new CustomerManager();
    manager.LoadData(); 
    Customer customer = manager.FindCustomer(int id);
    

执行此操作的最佳方法是什么?

编辑:

我觉得我在这里被误解了。也许是因为我不够清楚。在 CustomerManager 类中,我有几个方法取决于本地列表 (_customers)。那么,我的问题是,我应该在哪里填写该列表?

最佳答案

您所描述的是“延迟加载”。

一个简单的方法是拥有这样的私有(private)属性:

private Lixt<Customer> _customers;
private List<Customer> Customers
{
  get
  {
    if(_customers == null)
      _customers = LoadData();
    return _customers;
  }
}

然后,你引用Customers在内部。客户将在第一次需要时加载,但不会更早。

这是一个很常见的模式,以至于 .Net 4.0 添加了一个 Lazy<T>为你做这件事的类。

在这种情况下,您只需像这样将其定义为私有(private):

private Lazy<List<Customer>> _customers = new Lazy<List<Customer>>(LoadData);

然后,您只需在代码中引用您的客户:

_customers.Value

该类将使用您的 LoadData() 初始化该值方法。

如果您还没有使用 .Net 4.0,Lazy<T>类非常容易实现。

关于C# 在哪里加载对象中的初始数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4203777/

相关文章:

c# - 如何使用 Windsor 将依赖项注入(inject)自定义 RoleProvider?

c# - C# 中的数字类型后缀

c# - 方法有一些无效参数?

C# 添加过滤器到组合框下拉列表

c# - 创建一个可以使用 C# 中的循环更改其名称的矩形

c# - C#有效语法(IF语句中的变量声明,不带括号)

c# - 通过引用传递(ref this)

.net - PrintDialog.ShowDialog(this) 在 Windows 7 上立即返回 DialogResult.Cancel

c# - 来自模态对话框的模态对话框 - 当第二个关闭时都关闭 - 为什么?

.net - 您能否为 .NET Winforms 应用程序推荐低成本的自动化测试工具?