ByVal or ByRef

Hi,

I have a array of objects of a class (written by me) in my program. When i try to do some manupulation i make a function for that within the class and call the function with parameter as ByVal

soemthing like

private function NameofFunction(byval x as clsMyClass) as boolean
...
End function

Now,
When I test my program it is giving error (logically) as it changes teh object of my array inspite of that I am just refering to it to read and no change in value.

Now Can any one please let me know. Who should i pass the variable (custom class object) so that a function doesn't change them?

Thanks

[626 byte] By [Vikasumit] at [2007-12-16]
# 1
Even though you are passing the array as ByVal, only the reference to the class is being copied, so you are still referring to the same object.

For value types (ie integers, floats, structures, etc) the entire object is copied when using ByVal. However for reference types (ie classes and arrays) only the reference to the object is copied.

To make the function use a copy of the array, simply call the Clone() method on the array before passing it to NameofFunction.

DavidM.Kean at 2007-9-9 > top of Msdn Tech,.NET Development,.NET Base Class Library...
# 2
Hi,

You answer seems to be the solution of my problem (I haven't try it yet but will test it in few mins.) But One question that arise is that on few occasion (after getting this problem) , I try to send the values using sample code below



function abc (byval x as myclass)
...
end function
...
abc(new myclass(myobject))
...


NOw does in this way it still send the reference or val (my class again has a constructor with object parameter
something like this


Public Sub New(ByVal Makeas As clsPosition)

t_x = Makeas.X

t_y = Makeas.Y

End Sub



Does this also pass as reference or this constuctor and method of calling pass it as byval.

Thanks

Vikasumit at 2007-9-9 > top of Msdn Tech,.NET Development,.NET Base Class Library...
# 3
David has already given the solution. I just want to mention that byref/byval makes a difference when passing object also. See the following:
MethodB creates a new instance of the parameter but this does not affect the callers object that was passed as parameter, since the parameter is byval. MethodC however changes the callers object since the parameter if byref.


Public Class Class1
Public Param As String
Sub New(ByVal mParam As String)
Param = mParam
End Sub
End Class
Public Class Class2
Sub methodA()
Dim obj As Class1 = New Class1("created by method A")
MsgBox(obj.Param) 'this will prompt: created by method A
methodB(obj)
MsgBox(obj.Param) 'this will still prompt: created by method A
methodC(obj)
MsgBox(obj.Param) 'this will prompt: modified by method C
End Sub
Sub methodB(ByVal obj As Class1)
obj = New Class1("modified by method B")
End Sub
Sub methodC(ByRef obj As Class1)
obj = New Class1("modified by method C")
End Sub
End Class

papadi at 2007-9-9 > top of Msdn Tech,.NET Development,.NET Base Class Library...
# 4
Hi,

Thanks for your solution, and i am still testing my code and doesn't find the reason of misbehave of it. As i am using more of your method and on only few occasion I have used Array to be passed. But both of your answer are what I required.

Is there any specific reason that why the byval is not used when passing array and or object as david suggest.

I mean if we are using Byval that mean it should clone it by itself and do the job.

Thanks

Vikasumit at 2007-9-9 > top of Msdn Tech,.NET Development,.NET Base Class Library...
# 5
No. Using byval does not mean that. ByVal means that the reference will be copied, not the object itself. For simple datatypes, referense and object is the same thing. However, for complex types like class instances and arrays, reference and object are two different things. Using ByVal for complex types means that the reference of the object that will be assinged to the parameter will be different than the reference of the object used in the code that is calling the method. If the method re-assignes the parameter inside it (like methodB does in my example) the calling method will not be affected (message box still displays the same string).
Using ByRef on the other hand means that the same reference of the object will be passed in the method. If the method re-assinges the parameter inside it (like methodC does in my example) the calling method will also be affected (message box displays the new string).
To copy an object or arry, as David mentions requires that you copy the object entirely. You can use Array.Copy for arrays. For other classes, you will have to implement the copy code your self.
papadi at 2007-9-9 > top of Msdn Tech,.NET Development,.NET Base Class Library...
# 6
Hi,

I have try what you have suggested, But I am not getting that how I can pass a "clone" of my 2D array.

I use this

Myfunction(MyArray.Clone)

But It still send it by reference and not the clone of it.

Please let me know the syntax of how to pass 2D array as ByVal type of stuff..;)

Vikasumit at 2007-9-9 > top of Msdn Tech,.NET Development,.NET Base Class Library...
# 7

Are you sure that it's not sending the clone? Can you post some code that reproduces this?

Also, remember when an array is cloned, only the array is cloned not the objects contained within the array.

DavidM.Kean at 2007-9-9 > top of Msdn Tech,.NET Development,.NET Base Class Library...
# 8
Hi,
Sorry that I read it late as I clone my Array using temprory varibale without the Clone Method..

can you explain a bit more on what do you mean by Array clone clones the array and not the object in it..

I have this code

class myclass
...
end class

class myclass2
...
dim x(2,2) as myclass
...

function getobject (byval tmp(,) as myclass) as boolean
...
end function

function callerone() as boolean
return getobject(x)
end function
end class


the code above doesn't work for me and I change the callerone as given below



function callerone() as boolean
dim i,j as integer
dim tmp2(2,2) as myclass
for i =0 to 2
for j=0 to 2
tmp2(i,j)=new myclass(x(i,j)) 'myclass has a constrcutor for this
next
next
return getobject(tmp2)
end function


Well my orginail code it too big to post that is why I make this code that is giving error ..

Can you explain if this works or not...Though I make it work with the callerone in as given below and it is working but the above one is not working

Thanks

Vikasumit at 2007-9-9 > top of Msdn Tech,.NET Development,.NET Base Class Library...
# 9
Truthfully I can't actually see what you are trying to do.

As I stated above to clone an array simply call the Clone method. Why are you trying to avoid using it?

DavidM.Kean at 2007-9-9 > top of Msdn Tech,.NET Development,.NET Base Class Library...
# 10
Hi,

Let me try to explain it using my original application...

I am making a Chess game .. In this i have a Class of pieces ...
And a GameEngine class which Has Array of Pieces.. (2D Array of 8x8) chess board...

Now At one stage i need to Pass the Complete Array to a function to simulate teh move in chess game.. and as it is just a simulation of move i doesn't want my Board actual get disturb...Therefore I want to "CLONE" it ...but when I try to do

PieceArray.clone it doesn't clone my PieceArray and that is what I am asking. hope that make more sense and make it clear to you as well..

Big Smile

Vikasumit at 2007-9-9 > top of Msdn Tech,.NET Development,.NET Base Class Library...

.NET Development

Site Classified