Function myFunction() As String
myFunction = "MyValue"
End Function
Function myFunction2() As String
'Your code here
End Function
上面的编译,既没有显式的“返回”,也有更多的开销。 如果你尝试用C#来做这件事
string myFunction()
{
//Error due to "Cannot assign to 'myFunction' because it is a 'Method Group'
myFunction = "test";
}
string myFunction2()
{
//Error due to "not all code paths return a value
}
public bool MyFunction()
{
bool result = false;
if (someCondition == true)
{
// Do some processing
result = true;
}
else if (someOtherCondition == true)
{
// Do some processing
result = true;
}
// ... keep going
return result;
}
6条答案
按热度按时间t1qtbnec1#
这句话不适用于C#。
在C#中,你必须显式地设置一个“return”才能有一个有效的函数,如果没有return,你会得到一个编译错误,大意是“不是所有的代码路径都返回一个值”。
在VB.NET中,这将适用于VB.NET,因为VB.NET没有显式返回的要求,并且允许您拥有从不返回值的函数,以及允许您使用函数的名称设置返回。
举个例子
在VB.NET中你可以这样做
上面的编译,既没有显式的“返回”,也有更多的开销。
如果你尝试用C#来做这件事
我的评论注意到你得到的错误。
i2byvkas2#
这篇文章有点模糊。作为一名C#开发人员,我的第一个想法是“反对什么?”。然而,他可能指的是这样的东西:
他可能建议用
return true;
替换result = true;
语句可能会有更好的性能。我个人对此不太确定......这在JIT理论中已经很深入了,我认为与您可以实现的其他性能改进相比,所获得的任何收益都是非常小的。30byixjq3#
我不同意--我认为每个方法都有一个单独的输入和输出会让代码更容易阅读和调试。一个函数中有多个return语句会让代码导航更加复杂。事实上(如果可能的话),拥有更多的小函数比拥有多个出口的大函数更好。
hc2pp10m4#
对于VB.NET和C#来说,这在一定程度上是正确的。在C#中,程序员必须显式声明保存返回值的变量,这在VB.NET中是自动的。大多数返回值都在EAX或RAX寄存器中返回,JIT编译器必须在函数退出之前生成代码以从返回值变量加载寄存器。当您使用return语句时,JIT编译器可能有机会直接加载EAX寄存器,或者已经具有包含正确值的寄存器,并且跳过从变量加载指令而跳转到函数退出代码。
顺便说一句,这是一个相当大的“可能性”,真实的的代码总是用if来测试某个表达式()语句。计算该表达式几乎总是涉及使用EAX寄存器,它仍然必须用返回值重新加载。与x86编译器相比,x64 JIT编译器在这方面做了完全不同的工作,后者似乎总是在我做的一些抽查中使用该变量。所以除非你运行的是64位版本的Windows,否则你不太可能领先。
在过早优化的所有坏处中,这一点可以说是最糟糕的。潜在的时间节省是微不足道的,先写代码,然后再写概要。
ergxz8rk5#
我唯一的猜测是他说的是VB.NET而不是C#。VB.NET允许你像这样返回值
我的VB已经过时了,这可能比使用显式的return语句要慢
czfnxgou6#
通常有两个地方我退出一个函数。在我的方法开始验证传入数据时:
和/或在该方法的最后。
我不在条件语句中返回的原因是,这样函数就有一个退出点,这有助于调试。没有人愿意维护一个有12个return语句的方法。但这只是我个人的观点。我会在可读性方面犯错,除非你正在处理一个实时的必须更快的情况,否则我不会担心优化。