在foreach

时间:2017-11-15 12:20:27

标签: c# performance foreach cycle

我说得很简单(因为我在谷歌上找不到任何东西,也许是因为我不知道搜索什么)。

这之间的区别是什么:

foreach(var x in g.GetList())
{
 code
}

和此:

IEnumerable<object> list = g.GetList();
foreach(var x in list)
{
 code
}

在表现方面或最佳实践方面,还是其他方面?

2 个答案:

答案 0 :(得分:0)

在下面的代码中,您将直接调用foreach中的g.GetList()方法

foreach(var x in g.GetList())
{
 code
}

在下面的代码中,为变量分配了g.GetList()方法,然后在foreach中调用变量。与第一个代码相比,性能副,没有区别。只需编译器编译额外的一行。就是这样。

IEnumerable<object> list = g.GetList();
foreach(var x in list)
{
 code
}

但是如果g.GetList();方法返回null,那么您的第一个代码可能会引发空引用错误。所以最好的做法是在使用foreach中的变量/方法之前检查null条件

IEnumerable<object> list = g.GetList();
if(list == null)
{
retur false;
}
foreach(var x in list)
{
 code
}

由于type safe,必须使用真实对象而不是使用对象和动态数据类型。

IEnumerable<Employee> list = g.GetList();// as per employee is your class name
  

性能对于客户来说非常重要,但标准和可理解的编码对于开发人员来说非常重要。我希望你能理解我的解释。

答案 1 :(得分:0)

这两段代码:

foreach(var x in g.GetList())
{
 code
}

IEnumerable<object> list = g.GetList();
foreach(var x in list)
{
 code
}

只有1个区别,那就是你自己将调用g.GetList()的结果放入变量中。

IL-wise,当您为RELEASE模式编译时,编译器输出的内容将 100%相同

这是一个示例LINQPad程序:

void Main() {  }

static void Method1()
{
    foreach (var x in g.GetList()) { }
}

static void Method2()
{
    IEnumerable<object> list = g.GetList();
    foreach (var x in list) { }
}

static class g
{
    public static IEnumerable<object> GetList() => new List<object>();
}

将为两者 Method1和Method2生成此IL代码:

IL_0000:  call        UserQuery+g.GetList
IL_0005:  callvirt    System.Collections.Generic.IEnumerable<System.Object>.GetEnumerator
IL_000A:  stloc.0     
IL_000B:  br.s        IL_0014
IL_000D:  ldloc.0     
IL_000E:  callvirt    System.Collections.Generic.IEnumerator<System.Object>.get_Current
IL_0013:  pop         
IL_0014:  ldloc.0     
IL_0015:  callvirt    System.Collections.IEnumerator.MoveNext
IL_001A:  brtrue.s    IL_000D
IL_001C:  leave.s     IL_0028
IL_001E:  ldloc.0     
IL_001F:  brfalse.s   IL_0027
IL_0021:  ldloc.0     
IL_0022:  callvirt    System.IDisposable.Dispose
IL_0027:  endfinally  
IL_0028:  ret

除了你编写代码的方式之外没有区别。