2014-03-05 40 views
-1

我的問題是關於在VB.NET中使用ByVal的概念。ByVal如何爲vb.net中的對象工作?

下面是代碼:

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 

在上面的代碼段中,我在GetManipulateDetails功能,當值在該子程序被改變,其被返回對象發送tObject1以ByVal,操縱實際通過的對象。 即,如果我快速查看方法ManipulateDetails中的對象,我可以看到操縱的細節。 另外,如果我在子程序函數中返回對象,則該值將反映在傳遞的原始對象中。

的價值是越來越不返回從函數GetManipulateDetails對象甚至改變了,我很困惑,這是否因爲爲ByRef的發生?或者有一些其他機制正在完成這項工作。

回答

2

這可能是更清楚,如果我們使用不同的名稱:

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都是引用同一個對象。被複制的是參考,而不是對象。在GetManipulateDetails之內,它可以使用其引用的副本訪問該對象並對其進行更改。

ByVal參數總是複製 - 但參數或者是值類型或引用。它們本身從來都不是引用類型(又稱對象)。

+0

因此...如果我們將上面的代碼更改爲tObject1 = GetManipulatedDetails(tObject1),返回的值將是tObject1.sName =「Stack-Over-Flow」和tObject1.sLastName =「Flow-Over-Stack」 – Mych

+1

@ Mych - 我們不需要將代碼改爲true,因爲只有一個'customdatatype'對象,它是一個引用類型,並且tObject1'一直持有對它的引用。 –

+0

啊......明白......這會幫助我解決類似的問題。 – Mych

相關問題