TCP 서버에 대한 클라이언트 연결을 처리하기위한 클래스를 시작하기 시작했습니다. 여기에 내가 지금까지 코드를 작성했습니다되어ByRef 대 ByVal 설명
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
그래서, 내 오버로드 된 생성자에, 나는 예, System.Net.Sockets.Socket
의 예를에 참조을 받아들이는 무엇입니까?
이제 내 Socket
속성에서 값을 설정할 때 ByVal
이 필요합니다. 그것은 메모리에 예를이 가을 복사하고,이 새로운 인스턴스이 value
에 전달하고, 내 코드는 메모리에이 인스턴스를 참조 할 _Socket
을 설정 내 이해입니다. 예?
이것이 사실이라면 왜 네이티브 유형 이외의 다른 속성에도 속성을 사용하고 싶지 않습니다. 많은 멤버가있는 클래스 인스턴스를 복사하면 성능에 문제가 발생할 수 있습니다. 또한 특히이 코드에서는 복사 된 소켓 인스턴스가 실제로 작동하지 않는다고 생각하지만 아직 테스트하지 않았습니다.
어쨌든 내 이해를 확인하거나 안개가 낀 논리의 결함을 설명하면 크게 감사하겠습니다.
1도 참조 (내 의견이 위의 몇 줄을 채우기 위해) : 평가 전략은] (http://en.wikipedia.org/wiki/Evaluation_strategy은) -하는 ByRef은 '참조에 의한 호출'입니다 (요약하면 "변수에 할당하여 호출자가 전달한 변수에 영향을 미칠 수 있습니다") ByVal은 '값으로 호출'입니다. 참조 * 값이 전달 될 때 * ByteVal 전달 된 참조 형식을 여전히 변경할 수 있습니다. * 개체 자체의 복사/복제/복제가 발생하지 않습니다. –
+1 - '참조와 값 유형, ByVal과 ByRef의 개념을 혼동스럽게 생각한다고 생각합니다. 약간의 오해의 소지가있는 이름이 있긴하지만 그것들은 직교적인 문제입니다. ', C++에서이 문제가 발생했습니다. – Jono
우수하고 상세한 응답 – Hardryv