返回结果还是先将其放入变量?

时间:2014-05-09 20:32:34

标签: 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;
}

我更喜欢第一种直接方法,因为它似乎更有效。如果两者之间存在显着差异,请告诉我,如果是,那该怎么办?

4 个答案:

答案 0 :(得分:5)

据我所知,两个之间没有实际差异(第二个可能优化到第一个)。使用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    

再次,一个额外的任务和负载。你永远不会注意到差异。

答案 1 :(得分:3)

没有区别(我想这会被优化下来,在执行时会完全相同)。

第一个选项更简洁,后者为您提供了一个明显的断点,如果您以后决定使用查询,则可以轻松插入更多代码。也就是说,在这种情况下加入它很容易。只要选择最适合你的东西。

答案 2 :(得分:0)

无显着差异。我更喜欢第一个,虽然如果你使用第二个,它可能更容易调试,所以你可以看到你要返回的内容。此外,如果您可能需要对返回的内容进行一些更改,您可能最终会转向第二种方式。

答案 3 :(得分:0)

没有区别。除非我正在调试并想观看结果,否则我更喜欢第一个。

如果函数返回IQueryable<T>,请注意第一个选项,因为在调用函数迭代可查询之前,实际上不会对结果进行求值。如果您正在使用闭包和事物(运行时将尝试在它的上下文消失之后评估可查询的),这可能会导致奇怪的错误。