C# 效率方面的全局变量与局部变量分配

C# 效率方面的全局变量与局部变量分配,c#,.net,performance,oop,C#,.net,Performance,Oop,假设下面代码中的m_eligibleCustomers相当大,能够对效率产生影响,那么哪种方式在效率方面更好 全局声明它,并在创建对象时为变量赋值,直到对象超出范围为止。或者只在方法内部分配值,假设20个方法中有3个需要它,它们可能不会全部被调用,可能属于不同的事件代码,因此一旦方法超出范围,内存就会被释放 我个人喜欢全局操作,在第一次使用时分配值,并重用,但如果对象相当大,这是一个正确的决定吗?我认为,我觉得在方法的范围内声明似乎是个好主意。在上面这样的场景中,选择什么更好 intern

假设下面代码中的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();
    }
}

是的,保持全局性,因为您每次都需要调用DB,但gobal变量是老派的,请使用缓存来存储此类对象,尤其是在web应用程序中,这样您就可以设置过期日期,等等,如果您想提高效率,请转到C或Assembler。否则,高效地编写算法。在最坏的情况下,放弃递归,用一个可能更复杂的循环代替它——但永远不要对这类事情进行微观优化


以干净的方式编写代码,这样您将能够在一年内理解它,这比您可能获得的任何性能指标都有更多的价值,而任何解决方案都可能比它快00001%

不,这里根本不考虑局部变量和全局变量的效率。回到起点。编写干净的代码。谢谢,祝你今天愉快!即使是在清洁方面,你认为哪一个更容易阅读?如果遵循正确的命名约定,并且正确命名变量,我可以看到它们都是同样干净的代码。在可重用性方面,请确保首选全局方式。对于这一次,你能考虑一下你必须考虑到一个性能吗?我并不是在暗示保留几十个代表相同数据的额外对象是合适的,特别是对于更大的对象或缓慢的重建方法,但是,这种生命周期管理不是使用局部变量和成员变量之间的选择:它是关于生命周期的,不管它们是如何维护的。变量有助于保持这些对象的可访问性/可访问性,但将成员变量中的对象或当前作用域中的变量传递给函数以用作局部变量等都没有问题。至于何时保持共享/缓存数据是合适的,以及/或如何注入/创建、安全修改这些数据,如果相关的话,适当地处理——没有一个答案。我的一般建议是尽量减少这样的有效范围,尽量避免依赖对象的状态,这也有利于将对象作为参数提供给内部方法并编写纯函数。如果数据可能不需要,则可能需要考虑懒惰初始化。我将从缓存中读取数据,然后执行操作。若你们想提高效率,那个么就去找C或汇编程序。如果您的项目已经在某个特定域上运行多年,该怎么办?遵循适当的命名约定,适当命名方法/变量,我可以看到代码干净易懂。如果你真的相信它会做出改变,那么就对它进行基准测试。我优化了C代码。通常我必须优化我的同事的算法,或者确保他们使用正确的类型来完成正确的任务。这将性能提高了几个百分点。我已经在上面提到过了——我从来没有时间对这些事情进行优化——这就是为什么我的建议,和其他人一样——不要这样做,你不会从中得到任何东西的,谢谢。我喜欢你评论中的话,而不是回答中的话。谢谢。