是否更好的编码实践来定义foreach之外的变量,即使更冗长?

Edw*_*uay 23 c# foreach verbosity

在以下示例中:

  • 一个似乎更冗长但更少浪费资源
  • 所述第二较小冗长,但更浪费资源(重新定义字符串中的每个环)

哪种编码更好?

第一个例子:

using System;
using System.Collections.Generic;

namespace TestForeach23434
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> names = new List<string> { "one", "two", "two", "three", "four", "four" };

            string test1 = "";
            string test2 = "";
            string test3 = "";
            foreach (var name in names)
            {
                test1 = name + "1";
                test2 = name + "2";
                test3 = name + "3";
                Console.WriteLine("{0}, {1}, {2}", test1, test2, test3);
            }
            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个例子:

using System;
using System.Collections.Generic;

namespace TestForeach23434
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> names = new List<string> { "one", "two", "two", "three", "four", "four" };

            foreach (var name in names)
            {
                string test1 = name + "1";
                string test2 = name + "2";
                string test3 = name + "3";
                Console.WriteLine("{0}, {1}, {2}", test1, test2, test3);
            }
            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 45

第二种形式不再浪费 - 它只是更好.

除非你想在迭代之间保持它们的值,否则在循环外声明变量没有任何好处.

(请注意,通常这不会产生任何行为差异,但如果变量是由lambda表达式或匿名方法捕获的,则情况并非如此.)

  • 您仍然在创建三百万个字符串,因为String是一个不可变类型.当您执行字符串+"1"时,您实际上正在创建一个全新的String对象并将其分配给某些东西,而不是修改原始对象. (17认同)
  • 但是如果我的foreach循环进行了一百万次的交互,那么我不是通过定义300万个字符串而不是3个字符串来打击性能吗? (4认同)
  • 你得到同样的打击方式.如果性能是问题,那么使用一个可变的StringBuilder并实际重用. (3认同)
  • @Edwad Tanguay,在场景后面,变量的空间只为函数创建一次,并在每次迭代时重用.更确切地说,除了函数和类范围之外,底层层没有范围和循环的概念.循环中的字符串连接永远不会好,请使用StringBuilder,如上所述. (3认同)

Ree*_*sey 18

就个人而言,我认为最好的做法是尽可能在最严格的范围内声明变量.

这提供了许多好处:

  1. 重构更容易,因为当变量已经在同一范围内时,提取方法更简单.
  2. 变量用法更清晰,这将导致更可靠的代码.

唯一的(潜在的)缺点是额外的变量声明 - 然而,JIT倾向于优化这个问题,所以这是我在实际工作中不必担心的问题.

一个例外:

如果您的变量将增加大量的GC压力,并且如果通过foreach/for循环重用相同的对象实例可以避免这种情况,并且如果GC压力导致测量的性能问题,我会将其提升到外部范围.


wom*_*omp 5

这些都是浪费和冗长的.

foreach (var name in names)
{
   Console.WriteLine("{0}1, {0}2, {0}3", name);
}
Run Code Online (Sandbox Code Playgroud)

.

</tongueincheek>
Run Code Online (Sandbox Code Playgroud)

  • 实际上,`Console.WriteLine("{0} 1,{0} 2,{0} 3",名称)`将是我的偏好. (23认同)