【发布时间】:2014-09-16 21:21:13
【问题描述】:
假设下面代码中的m_eligibleCustomers对效率有相当大的影响,哪种方式在效率方面更好。
在创建对象时全局声明它并为变量赋值,并让它一直保持到对象超出范围。或者只在方法内部赋值,(假设20个方法中有3个方法需要它),不是所有的方法都可能被调用,可能属于不同的事件代码,这样方法一用完就释放内存范围。
我个人喜欢在全局范围内进行,在第一次使用时赋值并重用,但如果对象相当大,那是一个正确的决定吗?更多我认为,我觉得在一个方法范围内声明似乎是一个好主意。在上述情况下选择什么是更好的选择?
internal class Program
{
private DataSet m_CustomerSet;
private IEnumerable<Customer> m_eligibleCustomers;
public Program()
{
m_CustomerSet = GetDataSetFromCache();
m_eligibleCustomers = GetEligibleCustomers(customerSet);
}
private void OnClick(object sender, EventArgs e)
{
MethodA(eligibleCustomers); //OR MethodA(customerSet) and do calculation with in the method
//and object is destroyed as soon as the method is completed
MethodB();
MethodC();
MethodD();
MethodE();
MethodF();
MethodG(eligibleCustomers);
MethodH();
}
}
【问题讨论】:
-
没有。完全不在这里考虑“效率”(就本地变量与“全局”变量而言)。回到起点。编写干净的代码。谢谢,祝你有美好的一天!
-
即使是清洁工方面,您认为哪一个更具可读性?如果遵循正确的命名约定并正确命名变量,我可以看到它们都是同样干净的代码。在可重用性方面,肯定首选全局方式。这一次,您能否考虑一下您必须考虑性能?
-
(我并不是要暗示保留大约几十个代表相同数据的额外对象是合适的,特别是对于较大的对象或缓慢的重建方法,而是说这个生命周期 i> 管理不是使用局部变量和成员变量之间的选择:它是关于生命周期的,但是它们是被维护的。变量有助于这些对象如何保持可访问/访问,但是在成员变量中传递对象没有问题, 或当前作用域中的变量,作为局部变量等使用的函数)
-
(至于何时保留共享/缓存数据是合适的 - 和/或如何注入/创建、安全修改和适当处理(如果相关) - 没有一个答案。我的一般建议是最小化此类的有效范围,并尽可能避免依赖对象的状态,这也有利于将对象作为参数提供给内部方法并编写“纯”函数。)
-
如果可能不需要数据,您可能需要考虑延迟初始化。
标签: c# .net performance oop