Estoy comenzando una clase para manejar las conexiones de cliente a un servidor TCP. Aquí está el código que he escrito hasta ahora:ByRef vs ByVal Aclaración
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
Por lo tanto, en mi constructor sobrecargado, estoy aceptando una referencia a un ejemplo de un System.Net.Sockets.Socket
, sí?
Ahora, en mi propiedad Socket
, cuando se establece el valor, se requiere que sea ByVal
. Es mi entendimiento de que la instancia en la memoria es copiada , y esta nueva instancia se pasa a value
, y mi código establece _Socket
hacer referencia a esta instancia en la memoria. ¿Sí?
Si esto es cierto, entonces no puedo ver por qué querría usar propiedades para todo menos para tipos nativos. Me imagino que puede haber un buen rendimiento si copias copias de instancias con muchos miembros. Además, para este código en particular, me imagino que una instancia de socket copiado no funcionaría realmente, pero aún no lo he probado.
De todos modos, si pudiera confirmar mi comprensión, o explicar los defectos en mi lógica de niebla, lo agradecería enormemente.
+1 Véase también (y mis comentarios para llenar en algunas líneas de arriba): [Estrategia de evaluación] (http://en.wikipedia.org/wiki/Evaluation_strategy) - ByRef es 'llamada por referencia' (en resumen: "se puede asignar a la variable y hacer que afecte a la variable pasada por la persona que llama") y ByVal es 'llamar por valor'. Todavía puede * mutar * los tipos de referencia pasados ByVal a medida que se pasa el * valor de la referencia * (no se produce Copia/Clonación/Duplicación del objeto en sí). –
+1 - 'Creo que estás confundiendo el concepto de referencias vs. tipos de valores y ByVal vs. ByRef. A pesar de que los nombres son un poco engañosos, son problemas ortogonales. "Esto viene de C++. – Jono
una respuesta excelente y detallada – Hardryv