ByRef vs ByVal Clarification

前端 未结 4 436
悲&欢浪女
悲&欢浪女 2020-11-27 06:51

I\'m just starting on a class to handle client connections to a TCP server. Here is the code I\'ve written thus far:

Imports System.Net.Sockets
Imports Syst         


        
4条回答
  •  失恋的感觉
    2020-11-27 07:15

    Remember that ByVal still passes references. The difference is that you get a copy of the reference.

    So, on my overloaded constructor, I am accepting a reference to an instance of a System.Net.Sockets.Socket, yes?

    Yes, but the same would be true if you asked for it ByVal instead. The difference is that with ByVal you get a copy of the reference — you have new variable. With ByRef, it's the same variable.

    It is my understanding that the instance in memory is copied

    Nope. Only the reference is copied. Therefore, you're still working with the same instance.

    Here's a code example that explains it more clearly:

    Public Class Foo
       Public Property Bar As String
       Public Sub New(ByVal Bar As String)
           Me.Bar = Bar
       End Sub
    End Class
    
    Public Sub RefTest(ByRef Baz As Foo)
         Baz.Bar = "Foo"
         Baz = new Foo("replaced")
    End Sub
    
    Public Sub ValTest(ByVal Baz As Foo)
        Baz.Bar = "Foo"
        Baz = new Foo("replaced")
    End Sub
    
    Dim MyFoo As New Foo("-")
    RefTest(MyFoo)
    Console.WriteLine(MyFoo.Bar) ''# outputs replaced
    
    ValTest(MyFoo)
    Console.WriteLine(MyFoo.Bar) ''# outputs Foo
    

提交回复
热议问题