NeuralJack Posted January 1, 2007 Posted January 1, 2007 I think I know the answer to this , but just want to double check. Using OOP like a good boy should, I pass forms to other forms often. By default vs.net uses a ByVal word instead of byref. Also, I've seen many other vb.net code examples that pass a form to a form or an object around and ByVal seems to work like ByRef in those instances. Am i right? I sure hope i'm not passing a whole copy of the form over when i use ByVal, and I hope i'm just passing a reference to the form i want to pass. ByVal should actually mean that i'm passing a copy to the new form though, according to old C++, am i right? So are ByVal and ByRef pretty meaningless on many objects such as forms, controls, and other classes besides pure data values? Quote Currently Using: Visual Basic.Net 2005, .Net Framework 2.0
IceAzul Posted January 1, 2007 Posted January 1, 2007 (edited) Stack Heap -------------- ----------- | string b; | ---> | "Hello" | | int a = 9; | ----------- -------------- <a> is a value type (the value is on the stack) <b> is a reference type (or pointer, somewhat) to an value on the heap. When <a> or <b> is used ByVal a copy of the value on the stack is used as a parameter. When it is used ByRef, a pointer to <a> or <b> is used. So a ByRef pointer to a heap object is a pointer to a pointer, and you can change what the reference points to. For example Sub Main Dim s As String = "Hello" ' s is on the heap Dim i As Integer = 10 ' i is on the stack Change (s, i) Use (s, i) End Sub Sub Change (ByRef rs As String, ByRef ri As Integer) rs = "World" ' pointer to local s, changing it to point to the "world" on the heap ri = 14 ' pointer to local i, changing the value on the stack to 14 End Sub Sub Use (ByVal vs As String, ByVal vi As Integer) Console.WriteLine(vs) ' is a copy of the pointer to the heap Console.WriteLine(vi) ' is a copy of the value End Sub Edited January 1, 2007 by IceAzul Quote
NeuralJack Posted January 1, 2007 Author Posted January 1, 2007 Ok thanks for the details. I'll stick with ByVal for heap objects. Stack Heap -------------- ----------- | string b; | ---> | "Hello" | | int a = 9; | ----------- -------------- <a> is a value type (the value is on the stack) <b> is a reference type (or pointer, somewhat) to an value on the heap. When <a> or <b> is used ByVal a copy of the value on the stack is used as a parameter. When it is used ByRef, a pointer to <a> or <b> is used. So a ByRef pointer to a heap object is just a pointer to a pointer. Quote Currently Using: Visual Basic.Net 2005, .Net Framework 2.0
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.