我刚刚开始学习一个类来处理与 TCP 服务器的客户端连接。这是我迄今为止编写的代码:
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
因此,在我的重载构造函数中,我接受参考 to an instance of a System.Net.Sockets.Socket
, yes?
现在,在我的Socket
属性,设置值时需要ByVal
。据我了解,instance记忆中是copied, 和这个新实例被传递给value
,和我的代码集_Socket
在内存中引用此实例。是的?
如果这是真的,那么我不明白为什么我想使用除本机类型之外的任何属性。我想如果复制具有大量成员的类实例,性能可能会受到相当大的影响。另外,特别是对于这段代码,我想复制的套接字实例不会真正起作用,但我还没有测试过它。
不管怎样,如果你能证实我的理解,或者解释我模糊逻辑中的缺陷,我将不胜感激。
我认为您混淆了引用与值类型的概念,ByVal
vs. ByRef
。尽管它们的名称有点误导,但它们是正交问题。
ByVal
在 VB.NET 中意味着所提供值的副本将被发送到函数。对于值类型 (Integer
, Single
等)这将提供该值的浅表副本。对于较大的类型,这可能效率低下。但对于参考类型(String
,类实例)传递引用的副本。因为副本通过突变传递给参数=
它对调用函数不可见。
ByRef
在 VB.NET 中意味着对原始值的引用将发送到函数 (1)。这几乎就像在函数中直接使用原始值一样。类似的操作=
将影响原始值并在调用函数中立即可见。
Socket
是一个引用类型(读取类),因此将其传递给ByVal
很便宜。即使它确实执行复制,它也是引用的副本,而不是实例的副本。
(1) 但这并不是 100% 正确,因为 VB.NET 实际上在调用点支持多种 ByRef。有关更多详细信息,请参阅博客条目ByRef的众多案例
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)