代码之家  ›  专栏  ›  技术社区  ›  JamesSugrue

哪种方法更有效地为.NET中的变量赋值?

  •  7
  • JamesSugrue  · 技术社区  · 16 年前

    这是我一直在想的事情,但从来没有费心介绍。

    将值赋给临时变量是否比继续使用该值更有效?一个例子可能更清楚:

    string s = reader.GetItem[0].ToString();
    someClass.SomeField  = s;
    someOtherClass.someField = s;
    

    someClass.SomeField  = reader.GetItem[0].ToString();
    someOtherClass.someField = reader.GetItem[0].ToString();
    

    我最初认为最上面的示例会更有效,因为它不需要访问项集合或调用ToString。

    会有兴趣听到别人的想法,或是肯定的答案。

    8 回复  |  直到 15 年前
        1
  •  15
  •   Brian    16 年前

    编译器不知道右侧的表达式是否有副作用,因此如果您对它进行两次编码,它必须重新计算它。因此,第一个更高效,因为它不会重新执行getItem&toString调用。

    因此,如果程序员知道这些调用是纯/等幂的,那么应该首先编写代码。

        2
  •  6
  •   Community CDub    7 年前

    AS Brian 尽管第一种方法在现实世界中是否会有很大的不同,但它将更加有效,这取决于复制函数的价格以及整个代码的调用频率。

    然而,除了效率更高之外,第一种方法更好地表明了意图——您的意思是将相同的值赋给这两件事。它也有助于维护性,因为如果需要更改,您只需要在一个地方更改它。对我来说,这两个方面通常比效率更重要。

        3
  •  2
  •   Marc Gravell    16 年前

    还有另一个选项-复合分配:

    someOtherClass.someField  = someClass.SomeField  = reader.GetItem[0].ToString();
    

    使用此用法,编译器将计算 reader.GetItem[0].ToString() 一旦 ,并使用它来分配给两个成员 使用 get 属于 someClass )它通过复制堆栈上的值(不需要显式的本地值)来实现这一点。

    效率很高,但老实说,我不会对原始变量感到太兴奋。

        4
  •  0
  •   Johann Gerell    16 年前

    好吧,假设 ToString 函数不只是分发一个对一些预先生成的内部对象的引用,必须非常清楚,第一个版本(只有一个调用)将是最快的。但是,如果这是一个性能问题,那么您应该关心或不关心的是一个完全不同的情况。

    一个问题 然而,考虑一下,如果从另一个线程同时访问/更改项,第二个示例可能在第一行和第二行中呈现不同的结果。

        5
  •  0
  •   tvanfosson    16 年前

    如果要多次使用某个局部变量,我就习惯于将它存储在该局部变量中。不过,通常情况下,这是因为我更喜欢代码的紧凑性,而不是过于关注效率——不过,如果在循环中重复使用代码,我肯定会这样做。

    有时,我不一致,只会重新输入,特别是如果只使用访问器而不调用需要计算的方法。

        6
  •  0
  •   Tim Stewart    16 年前

    这是我的经验法则。当有疑问时, profile your code . 优化编译器可以删除大量代码,从而使代码运行更快。

    还必须考虑两个事实:

    • .NET很快地分配内存。
    • 由于额外的页面错误、引用位置差、垃圾收集过多,垃圾过多会减慢应用程序的运行速度。

    这意味着在粗略的观察下,您的代码可能非常快,但是如果您生成了大量垃圾,那么您的程序在运行一段时间后的性能将受到影响。

        7
  •  0
  •   shahkalpesh    16 年前

    可读性很重要。 “s”命名变量的用法是什么?

    此外,字段名将更合理,而不是使用[0]。

        8
  •  0
  •   grantwparks    15 年前

    还有其他问题需要考虑。如果使用 s ,分配给其他变量,与 S 是由多行代码初始化的,您打开了其他人会出现的可能性,并在以后添加代码来更改 S 在它的使用之间,或以某种方式围绕原始分配分支到 S .

    我经常看到的一件事是函数的赋值返回到一个变量,即使这个值只在一个地方使用,我讨厌这样做,因为(不管那个变量叫什么名字)不可避免地导致必须找到那个变量被分配到哪里去知道它真正代表了什么。将函数的返回值直接分配给将要使用它的对象,显式地指示正在进行的操作。

    编程中有一个派别相信“无变量编程”(几十年前著名的“无Goto编程”论文的风格)。例如,XSL虽然有“变量”,但它们在单个范围内的初始分配之后是不可变的。有人说,这有助于确保没有意外的副作用。