多次实例化类的性能问题

时间:2009-05-15 18:58:08

标签: c# .net performance

我想知道在表单中或在需要时实例化一次类之间的性能差异。例如,假设我有一个客户表单来编辑客户。在表单加载上,我实例化一个客户类并调用一个函数来返回客户数据以填充表单控件。

CustomerInfo customer = new CustomerInfo();
CustomerDetail  cust = customer.GetCustomer(customerId);
txtName. cust.Name;
...

表格上还有一个保存按钮。单击该按钮时,我创建Customer类的另一个实例以更新数据。

CustomerDetail cust = new CustomerData();
cust.Id = customerId;
cust.Name = txtName.Text;

CustomerInfo customer = new CustomerInfo();
customer.Update(cust);

我知道这很好用。但是,性能方面是否更好,只需为整个表单创建Customer类的单个实例以调用GetCustomer和Update?我知道GC将处理这些实例,但我不确定它会破坏第一个实例然后继续下一个实例。

此外,这个例子我只使用两个函数调用客户类,但实际上,可能会有更多。

感谢您的帮助。

6 个答案:

答案 0 :(得分:8)

我们的想法应该是为您正在操作的每个不同客户创建一个Customer实例。因此,如果您的表单只处理单个客户,那么您应该只有一个实例,但如果您的表单处理多个客户,那么您将拥有多个实例。

就性能而言,如果您处理许多实例,这只会成为一个问题,我会说成千上万。

答案 1 :(得分:1)

就个人而言,我会保留表格中的实例。一遍又一遍地实例化似乎是不必要的开销。我同意Vincent Ramdhanie的观点,即每个客户都有一个实例,所以如果你改变了客户,你应该得到一个新实例。

另外,通过保持实例可以轻松检查它是否真的发生变化,如果持续更改存在相当大的开销,我倾向于这样做。但这是另一个问题。

答案 2 :(得分:1)

过早优化是万恶之源。

在您编写解决方案以获得最佳可读性之前,不要考虑优化,并且发现它不足以通过测试客户规范的测试。

如果您的优化没有通过与未经优化的版本失败的相同测试,请将其还原。

答案 3 :(得分:0)

我会将该功能移至CustomerRepository类,并在我的应用程序中创建一个实例,在创建/加载表单时创建

即。获取/保存客户数据代码。

答案 4 :(得分:0)

当您需要使用相同的表单更新或创建“客户”时,单个实例的方法很有用。

答案 5 :(得分:0)

当然,不重新创建对象的开销更少。此外,在您持有对象时,可能存在某种程度的隐式数据锁定(否则您需要某种外部数据锁定,如果其他人可以访问数据库,或者除非您不关心更新冲突)。

另外,按照上面的方式进行操作会假设您的表单知道所有属于CustomerData的字段 - 您没有保留原始对象并更新它,因此您最好制作确保你从中获取了所有数据并将其手动传输到“新”对象。然后,您的代码与CustomerData的定义(和实现)紧密相关 - 如果有人添加了可见字段,您的代码需要修改。如果他们添加了“隐藏”字段或状态,那么您的代码真的需要修改。

所以我建议保留对象并更新它,并单独(根据需要)处理任何锁定要求。