Sub与Function没有返回值

tes*_*sto 6 vba

什么是子程序(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这样的静态代码分析工具(我维护该项目)将标记这些函数,因为它们是隐藏在代码库中的潜在错误,等待咬你:

Rubberduck代码检查结果


Com*_*ern 9

我可以想到几个原因.

  • 它可以防止调用者尝试将不存在的返回值分配给某些东西:

    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语句的显式类型).这并不意味着它没有 - 它确实如此.

  • @this沿着这些相同的路线,我不会真的认为为一个副作用的`Function`返回一个"成功"的"布尔"是不好的做法. (3认同)
  • 只是一个FYI - 在Access'的情况下,一个函数只能在宏和表达式中使用,即使你没有任何东西可以返回,因为AIUI,Access需要能够跟踪函数是否被调用而且它不能做与sub.结果是,在Access VBA项目中,可能存在一些函数 - 伪造为子,以满足此宏需求.但是,在这些情况下,返回一个"布尔"值通常很好. (2认同)