我说得很简单(因为我在谷歌上找不到任何东西,也许是因为我不知道搜索什么)。
这之间的区别是什么:
foreach(var x in g.GetList())
{
code
}
和此:
IEnumerable<object> list = g.GetList();
foreach(var x in list)
{
code
}
在表现方面或最佳实践方面,还是其他方面?
答案 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
除了你编写代码的方式之外没有区别。