私は、TCPサーバーへのクライアント接続を処理するクラスを開始しています。ここで私は、これまでのコード書いたされていますByRef vs ByVal Clarification
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は「値渡し」です。参照の*値が渡されたときにByValを渡した*参照型を変更することもできます(コピー/複製/複製は行われません)。 –
+1 - 'リファレンスと値の型、ByValとByRefのコンセプトを混同していると思います。名前がちょっと誤解されているにもかかわらず、それらは直交した問題です。」C++から来て、これは私を捨てました。 – Jono
優れた&詳細な返信 – Hardryv