什么是子程序(Sub)的意义?为什么不使用Function没有返回值的?
编辑
我的意思是,为什么关键字Sub存在?我可以使用Function而不声明返回值并具有相同的,不是吗?
Mat*_*don 20
一个Function清楚的写着"我有东西给你,当我返回".该预期是一个Function回报的东西,因为那是什么功能的意思做.
一个Sub清楚地说"我正在做一些你应该期望最终成功的事情 ".的期望是,Sub执行操作,改变一些状态下,会导致一些副作用.
一个Function将被命名DoSomething,只是作为一个令人费解Sub的是将被命名为GetFoo:该意图是模糊的,它是如何发布的程序冲突的性质.我希望DoSomething要么成功做某事,要么抛出一些错误.同样地,我希望GetFoo,好吧,给我一个Foo.
在几种编程语言中,Function甚至无法编译在所有代码路径中都不返回值的(或语义相似的构造).对VBA中的所有内容使用函数 - 无返回值听起来非常像滥用语言,因为VBA不会抱怨它.正如常识告诉我们的那样,并不是因为我们可以,我们应该这样做.
为什么返回void,什么时候可以返回bool,而不是分配它?
public bool DoSomething()
{
// do stuff...
// ...and don't assign the return value.
// woopsie, doesn't compile.
}
Run Code Online (Sandbox Code Playgroud)
VBA Sub过程就像一个C#void方法:它明确了它的非返回特性,这是一件好事.
众所周知,VBA编译器并不关心你是否编写代码,因为它永远不会清楚你是否有意返回隐式返回值.
当你做的意思是返回一个值-即忘,因为错误发生的时间-你怎么能肯定这一个是合法的非回来了,那另外一个是不是?没有梳理代码并完全理解它所做的一切以及为什么,你无法分辨.如果你很幸运,你会看到那些显然做一件事的小型专业功能,并且做得很好.否则,你需要浪费时间了解正在发生的事情,只是为了确定应该已经很明显的事情.
像Rubberduck这样的静态代码分析工具(我维护该项目)将标记这些函数,因为它们是隐藏在代码库中的潜在错误,等待咬你:

我可以想到几个原因.
它可以防止调用者尝试将不存在的返回值分配给某些东西:
Sub example()
Dim x
x = Foo '<-- Potential runtime error.
x = Bar '<-- Compile error, Expected Function or variable.
End Sub
Function Foo()
End Function
Sub Bar()
End Sub
Run Code Online (Sandbox Code Playgroud)在Excel中,它允许它用作宏(假设它没有参数).
对于正在阅读代码的人来说,目的还不清楚.
Function Foo()
'Do some stuff
'WTH is the return value not assigned?!
End Function
Run Code Online (Sandbox Code Playgroud)它(应该,假设其他正常的编码实践)表明它不应该有副作用.一个Sub是预期有副作用.
特别是关于编辑.
我可以使用Function而不声明返回值并且具有相同的功能,不是吗?
这不是一个正确的陈述.如果你声明这样的函数......
Function Foo()
'Do some stuff
End Function
Run Code Online (Sandbox Code Playgroud)
...... 它仍然有一个返回值 - 它只是隐含的.上面的代码完全等同于:
Public Function Foo() As Variant
'Do some stuff
End Function
Run Code Online (Sandbox Code Playgroud)
VBA不会强制您显式声明返回值的类型(类似于它不需要Dim语句的显式类型).这并不意味着它没有 - 它确实如此.