【问题标题】:How ByVal works for Objects in vb.net?ByVal 如何处理 vb.net 中的对象?
【发布时间】:2014-03-05 07:55:31
【问题描述】:

我的问题是关于在 vb.net 中使用 ByVal 的概念。

代码如下:

Private Sub ManipulateDetails()
Dim tObject1 as New customdatatype

tObject1.sName = "Stack"
tObject1.sLastName = "Over"

GetManipulateDetails(tObject1)

End Sub


Private Function GetManipulateDetails(ByVal tObject1 as customdatatype)

tObject1.sName = "Stack-Over-Flow"
tObject1.sLastName = "Flow-Over-Stack"
Return tObject1

End Function

在上面的代码 sn-p 中,我在 GetManipulateDetails 函数中将 tObject1 作为 ByVal 发送,当此子例程中的值发生更改时,返回的对象将操作传递的实际对象。 即,如果我在 ManipulateDetails 方法中快速观察对象,我可以看到被操纵的细节。 此外,如果我在子例程函数中返回对象,则值将反映在传递的原始对象中。

因为即使没有从函数 GetManipulateDetails 返回对象,值也会发生变化,我很困惑这是否因为 ByRef 而发生?或者还有其他一些机制正在使这项工作发挥作用。

【问题讨论】:

    标签: vb.net byval


    【解决方案1】:

    如果我们使用不同的名称可能会更清楚:

    Private Sub ManipulateDetails()
    Dim tObject1 as New customdatatype
    
    tObject1.sName = "Stack"
    tObject1.sLastName = "Over"
    
    GetManipulateDetails(tObject1)
    
    End Sub
    
    
    Private Function GetManipulateDetails(ByVal tother as customdatatype) as customdatatype
    
    tother.sName = "Stack-Over-Flow"
    tother.sLastName = "Flow-Over-Stack"
    Return tother
    
    End Function
    

    在调用GetManipulateDetails 之前,tObject1 是对customdatatype 类型对象的引用。当您致电GetManipulateDetails 时,tother 将获得tObject1 的副本。重要的是,这意味着现在,tObject1tother 都是对同一对象的引用。复制的是reference,而不是对象。在GetManipulateDetails 内,它可以使用其引用的副本 来访问对象并对其进行更改。

    ByVal 参数总是被复制 - 但参数要么是值类型,要么是引用。它们本身绝不是引用类型(又名对象)。

    【讨论】:

    • 所以...如果我们将上面的代码更改为 tObject1 = GetManipulatedDetails(tObject1),则返回值将是 tObject1.sName = "Stack-Over-Flow" 和 tObject1.sLastName = "Flow-Over -堆栈"
    • @Mych - 我们不必更改代码即可,因为只有一个 customdatatype 对象,它是一个引用类型,并且 tObject1` 一直持有对它的引用.
    • 啊...明白...这将帮助我解决类似的问题。
    猜你喜欢
    • 2012-01-21
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2019-01-25
    • 1970-01-01
    • 2016-04-21
    • 2023-04-02
    相关资源
    最近更新 更多