0

私の質問は、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

上記のコード スニペットでは、GetManipulateDetails 関数で tObject1 を ByVal として送信しています。このサブルーチンで値が変更されると、返されたオブジェクトは、渡された実際のオブジェクトを操作します。つまり、メソッド ManipulateDetails でオブジェクトをクイックウォッチすると、操作された詳細を確認できます。また、サブルーチン関数でオブジェクトを返す場合、値は渡された元のオブジェクトに反映されます。

関数 GetManipulateDetails からオブジェクトを返さなくても値が変更されているため、ByRef が原因で発生しているのか混乱していますか?? または、この作業を行っている他のメカニズムがあります。

4

1 に答える 1

3

別の名前を使用すると、より明確になる可能性があります。

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、型のオブジェクトへの参照です。を呼び出すと、のコピーが取得されます。重要なことは、これが意味することは、現在、とが両方とも同じオブジェクトへの参照であることです。コピーされたのは参照であり、オブジェクトではありません。内では、参照のコピーを使用してオブジェクトにアクセスし、変更を加えることができます。tObject1customdatatypeGetManipulateDetailstothertObject1tObject1totherGetManipulateDetails

ByValパラメータは常にコピーされますが、パラメータは値型または参照のいずれかです。それらは参照型 (別名オブジェクト) 自体ではありません。

于 2014-03-05T07:59:39.130 に答える