c#内联函数参数和临时变量

时间:2012-01-04 23:42:44

标签: c# argument-passing

我想知道C#中的以下情况。

有时函数名称可能很长,而且冗长。我在工作中使用微软的MVC 3框架,这是一个示例函数:

[ImportModelStateFromTempData]
[BreadCrumb("New Event")]
public ActionResult New()
{
    var @event = _dbContext.EventRepository.CreateNewEvent();

    return View("New", 
        EventViewModel.FromEventDomainModel(@event));
}

可以在不使用临时变量@event的情况下重写此代码,如下所示:

[ImportModelStateFromTempData]
[BreadCrumb("New Event")]
public ActionResult New()
{
    return View("New", 
        EventViewModel.FromEventDomainModel(_dbContext.EventRepository.CreateNewEvent()));
}

第一个例子显然更清楚,但从纯粹的好奇心角度/表现来看,要么比另一个更快?特别是考虑到缓存的值@event只被使用一次。

在C ++中我记得发现@event的局部变量声明(如果这是C ++)将存储在New()的堆栈帧中,并且生成的汇编比直接插入参数的速度慢得多(而不是将其存放在临时中)。

C#编译器对这种情况更聪明吗?没有相同的性能考虑,我可以自由使用临时工具吗?

我知道预优化是邪恶的,我绝对不应该担心这种情况,但我很好奇。我甚至不确定我会在哪里查找有关此内容的更多信息,因为标题是我描述问题的最佳方式。那你觉得Stack Overflow怎么样?

2 个答案:

答案 0 :(得分:4)

由这些产生的IL将是等效的。如果你想向自己证明这一点,请尝试编译两者并用Ildasm查看生成的IL http://msdn.microsoft.com/en-us/library/f7dy01k1(v=vs.80).aspx

答案 1 :(得分:3)

临时变量很好。

调试时,可以查看功能结果。

如果存在延迟,则延迟为纳秒或微秒。

维护是王道。