Ich beginne gerade auf einer Klasse, Clientverbindungen zu einem TCP-Server zu behandeln. Hier ist der Code, ich habe bisher geschrieben:ByRef vs ByVal Erläuterung
Imports System.Net.Sockets
Imports System.Net
Public Class Client
Private _Socket As Socket
Public Property Socket As Socket
Get
Return _Socket
End Get
Set(ByVal value As Socket)
_Socket = value
End Set
End Property
Public Enum State
RequestHeader ''#Waiting for, or in the process of receiving, the request header
ResponseHeader ''#Sending the response header
Stream ''#Setup is complete, sending regular stream
End Enum
Public Sub New()
End Sub
Public Sub New(ByRef Socket As Socket)
Me._Socket = Socket
End Sub
End Class
Also, auf meinem überladenen Konstruktor, ich bin die Annahme eine Referenz auf eine Instanz ein System.Net.Sockets.Socket
, nicht wahr?
Jetzt, auf meiner Socket
Eigenschaft, muss der Wert ByVal
festgelegt werden. Es ist mein Verständnis, dass die Instanz im Speicher ist kopiert und diese neue Instanz an value
vergangen, und mein Code setzt _Socket
diese Instanz im Speicher zu verweisen. Ja?
Wenn das stimmt, dann kann ich nicht sehen, warum ich Eigenschaften für alles andere als native Typen verwenden möchte. Ich könnte mir vorstellen, dass es durchaus einen Leistungseinbruch geben kann, wenn Klasseninstanzen mit vielen Mitgliedern kopiert werden. Auch für diesen Code würde ich mir vorstellen, dass eine kopierte Socket-Instanz nicht wirklich funktionieren würde, aber ich habe sie noch nicht getestet.
Wie auch immer, wenn Sie entweder mein Verständnis bestätigen oder die Fehler in meiner nebligen Logik erklären könnten, würde ich es sehr schätzen.
+1 Siehe auch (und meine Kommentare in einigen Zeilen weiter oben zu füllen): [Bewertungsstrategie] (http://en.wikipedia.org/wiki/Evaluation_strategy) - ByRef ist 'call by reference' (kurz: "kann Variablen zuweisen und hat Einfluss auf die vom Aufrufer übergebene Variable") und ByVal ist "Aufruf nach Wert". Sie können die * Referenztypen, die ByVal übergeben haben, immer noch * mutieren, da der * Wert der Referenz * übergeben wird (keine Kopie/Kopie/Duplizieren des Objekts selbst erfolgt). –
+1 - "Ich denke, Sie verwirren das Konzept der Referenzen vs. Werttypen und ByVal vs. ByRef. Obwohl die Namen etwas irreführend sind, handelt es sich um orthogonale Probleme. ", Das kam von C++, was mich abwarf. – Jono
eine ausgezeichnete und detaillierte Antwort – Hardryv