私有子可以将新创建​​的变量传递给 main() 吗?

Posted

技术标签:

【中文标题】私有子可以将新创建​​的变量传递给 main() 吗?【英文标题】:Can private sub pass newly created variable to main()? 【发布时间】:2017-05-21 22:11:59 【问题描述】:

私有子程序是否可以在从主程序接收到值后与主程序在同一模块中,创建新变量并将其传递回主程序?

这是我想要做的,但我遇到了一些困难。 例如,在下面的 testSUB 中,我更改了字符串。我可以将 extraSTRING 和 newSTRING 传回 main 吗?任何示例都会有所帮助。

Module module1
    Sub main()
        Dim l As String
        Dim I As Long = 1
        Dim A As String
        testsub(l, A, I)
    End Sub

    Private Sub testSub(l As String, A As String, I As Long)
        Dim extraSTRING As String = "extraTEXT"
        Dim newSTRING As String = l & extraSTRING
    End Sub
End Module

【问题讨论】:

在这个例子中你不清楚你在追求什么。但是,您可以将 testSub 变成一个函数并以这种方式返回一些东西。或者您可以使用ByRef 传递的参数。 @Jinx88909 :在我看来这就是他想要的。你应该用这两个选项写一个答案。 @VisualVincent 作为答案发布。在我的手机上,所以希望我没有犯任何错误。没那么容易:) 当子例程接受参数时,它可以通过 2 种方式中的 1 种方式进行 - Byref 或 byval。 Byval 是默认值,意味着您传递的值将被复制到内存中。 Byref 表示要传递一个内存地址或指针。当子例程作用于参考值时,调用者会固有地注意到对该值的修改。 @Jinx88909 已经回答了你的问题。或者,您可以简单地编写一个函数而不是一个子函数。 Private 声明意味着它仅在该模块内可用。 @Jinx88909 :嘿,我几乎所有的答案都是用手机写的。 ;) 【参考方案1】:

要返回一个值,您可以将 Sub 转换为 Function

Private Function testFunction (ByVal arg1 As String) As String

    Return arg1 & " and some more text"

End Function

要调用上述Function 并分配返回的值,请使用以下代码:

Dim a As String = testFunction("some text")

'Output:
'a = "some text and some more text"

下面是带有输出的代码截图:

您也可以使用ByRef:

指定以这样一种方式传递参数,即被调用的过程可以更改调用代码中参数基础的变量的值。

ByRef 与 ByVal 略有不同:

指定以这样一种方式传递参数,即被调用的过程或属性不能更改调用代码中参数基础的变量的值。

以下是一些示例代码,向您展示了操作上的差异:

Module Module1

    Sub Main()
        Dim a As Integer = 0
        Dim b As Integer = 0
        Dim c As Integer = 0

        testSub(a, b, c)

        'Output:
        'a = 0
        'b = 0
        'c = 3

    End Sub

    Private Sub testSub(arg1 As Integer, ByVal arg2 As Integer, ByRef arg3 As Integer)
        arg1 = 1
        arg2 = 2
        arg3 = 3
    End Sub

End Module

通过在VB.NET 中不指定modifier(如上面的arg1 所示),默认情况下编译器将使用ByVal

这里需要注意的是,虽然VB.NET 在未指定的情况下默认使用ByVal,但VBA 不使用,而是默认使用ByRef。如果您将代码从一个端口移植到另一个端口,请注意这一点。

下面是带有输出的代码截图:

以您的代码为例:

Sub main()
    Dim l As String
    Dim A As String
    Dim I As Long = 1
    testSub(l, A, I)
End Sub

要传递变量 lAI 并更改它们的值,您需要更改方法以使用修饰符 ByRef

Private Sub testSub(ByRef l As String, ByRef A As String, ByRef I As Long)
    l = "TEXT"
    A = "extra" & l
    I = 100
End Sub

下面是带有输出的代码截图:

【讨论】:

感谢您的示例。 感谢您的展示。它说得很清楚,它确实回答了我的问题。

以上是关于私有子可以将新创建​​的变量传递给 main() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swiftui 中为子视图设置私有状态变量?

如何使用'for'循环将新变量传递给python脚本

如何从 Access VBA 中的另一个私有子获取私有子中声明的变量的值

Terraform - 无法将字符串变量传递给子模块

如何解决:上下文提供程序未将新的上下文值传递给子级

将变量传递给main方法java