我们在工作中讨论了代码设计问题,其中之一是处理调用布尔方法后的响应,比如:
bool ok = IsEverythingOK();
if(ok)
{
//do somehthing
}
我的一个同事坚持认为我们可以跳过额外的变量ok,直接写
if(IsEverythingOK())
{
//do somehthing
}
他说使用"bool ok"语句在内存方面不好。
那么我们应该使用哪个呢?
您的问题的意思是:
使用本地变量是否需要付费?
C#和.NET都是经过精心设计的,我的期望是像您描述的那样使用本地变量没有或者只有微不足道的成本,但让我试着通过一些事实来支持这个期望。
下面是C#代码:
if (IsEverythingOk()) {
...
}
call IsEverythingOk
brfalse.s AfterIfBody
... if body
使用局部变量
var ok = IsEverythingOk();
if (ok) {
...
}
您将获得这个经过优化(并简化)的IL代码:
call IsEverythingOk
stloc.0
ldloc.0
brfalse.s AfterIfBody
... if body
call IsEverythingOk
test eax,eax
je AfterIfBody
IsEverythingOk
方法返回了true
,并且JIT能够完全优化掉分支。当我切换到在该方法中返回字段时,JIT将内联调用并直接访问该字段。一切都取决于你在循环中是否使用ok
。
例如:
bool ok = IsEverythingOK();
if(ok)
{
//do somehthing
ok = IsEverythingOK();
}
ok
进行任何操作,那么您可能会发现JIT编译器将会转换以下代码:bool ok = IsEverythingOK();
if(ok)
{
//do somehthing
}
...实质上变成了:
if(IsEverythingOK())
{
//do somehthing
}
...anyway.
我认为这是个人偏好,除非你有一个统一的编码标准。其中一个提供了好处。
如果您预计或假定修改if子句之外的内容,那么这很棒。虽然它在创建变量时会创建堆栈条目,但它可能会在方法作用域后被处理掉。
bool ok = IsEverythingOK();
if(ok)
{
//do somehthing
}
if(IsEverythingOK())
{
//do somehthing
}
bool
使用32位内存,最好不要创建局部变量。毕竟,在标准的8GB机器上,这将浪费可用内存的1/268,435,456。无论你做什么,都不要有25万个嵌套的if语句! - Enigmativity