c# - 返回结果还是先放到变量中?

标签 c# performance linq

我在 MVC 应用程序中使用 LINQ。我注意到我可以通过两种方式创建方法,两种方式都有效,但我不知道哪种方式最好。

直接:

public string GetStatus(int PersonId)
{
    return db.PersonStatus
        .Where(x => x.personid == PersonId)
        .Select(x => x.Status)
        .Single();
}

首先在 var 中:

public string GetStatus(int PersonId)
{
    string Item = db.PersonStatus
        .Where(x => x.personid == PersonId)
        .Select(x => x.Status)
        .Single();
    return Item;
}

我更喜欢第一种直接方法,因为它看起来更有效。请让我知道两者之间是否有显着差异,如果有,是什么?

最佳答案

据我所知,这两个之间没有实际区别(并且第二个可能会针对第一个进行优化)。使用 LINQ 和使用常规函数执行此操作之间也没有区别。

但是,第二个将更容易调试,因为您在计算结果后将结果放在某个地方,因此您可以放置​​一个断点并检查该变量。不过,我发现第一个稍微清晰一些。


这里有两个函数:

int Foo(int a, int b)
{
    int x = a+b;
    return x;
}

int Bar(int a, int b)
{
    return a+b;
}

这是在优化关闭的情况下生成的 IL(根据 LINQPad):

Foo:
IL_0000:  nop         
IL_0001:  ldarg.1     
IL_0002:  ldarg.2     
IL_0003:  add         
IL_0004:  stloc.0     // x
IL_0005:  ldloc.0     // x
IL_0006:  stloc.1     // CS$1$0000
IL_0007:  br.s        IL_0009
IL_0009:  ldloc.1     // CS$1$0000
IL_000A:  ret         

Bar:
IL_0000:  nop         
IL_0001:  ldarg.1     
IL_0002:  ldarg.2     
IL_0003:  add         
IL_0004:  stloc.0     // CS$1$0000
IL_0005:  br.s        IL_0007
IL_0007:  ldloc.0     // CS$1$0000
IL_0008:  ret         

您会注意到 Foo 有两行额外的行,它声明变量然后读取它。

这里是优化:

Foo:
IL_0000:  ldarg.1     
IL_0001:  ldarg.2     
IL_0002:  add         
IL_0003:  stloc.0     // x
IL_0004:  ldloc.0     // x
IL_0005:  ret         

Bar:
IL_0000:  ldarg.1     
IL_0001:  ldarg.2     
IL_0002:  add         
IL_0003:  ret    

同样,一项额外的任务和负载。您永远不会注意到差异。

关于c# - 返回结果还是先放到变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23573489/

相关文章:

c# - 网络请求数量有限

c# - 封装方法调用

linux - 报告内存和 cpu 使用情况 - matlab - 在多核 linux 服务器上

c# - 使用 Linq 和 group by 进行数据绑定(bind)转发器

c# - 将对象序列化为 XElement 并在内存中反序列化

c# - 在C#编译的exe中修改Emdeded String

c# - 当线程获得未处理的异常时 CLR 退出

database - View 会提高性能吗?

java - while循环应用了什么样的优化JIT

asp.net - 在转发器控件中显示来自 linq 数据源的图像