试图扩展BeginReceive
方法,并使MessageQueue.ReceiveCompleted
的事件处理程序通过REFERENCE传递一个TCPClient
对象。照原样,我可以将其作为对象传递,但是它将通过VALUE传递,因此将是TCPClient
对象的副本。不好!</ p>
因此,我决定尝试编写自己的重载方法,等等。调试到.NET 4.5.2 Framework代码中,我看到BeginReceive(TimeSpan timeout, object stateObject)
返回:
ReceiveAsync(timeout, CursorHandle.NullHandle, NativeMethods.QUEUE_ACTION_RECEIVE, null,
stateObject);
问题在于CursorHandle
和NativeMethods
似乎在System.Messaging.Interop
命名空间中,但是由于所有这些类都被声明为“内部”,因此我似乎无法访问它们。 (是的-我下载了.NET Framework C#代码)。有什么快速的方法可以访问这些东西?
答案 0 :(得分:2)
TCPClient是一个类,因此是引用类型。此类型的参数和变量包含对对象的引用。在这种情况下,ByVal
表示此引用是通过值而不是对象传递的。
TCPClient
对象将不会被复制!
请注意,您还可以传递引用ByRef
。在这种情况下,您要处理对对象的引用。这意味着如果在方法中将新对象分配给此类参数,则会更改用作方法参数的变量。如果参数为ByVal
,则不会更改此变量,因为方法参数将包含引用的副本(但不包含对象的副本)。
在两种情况下,如果您在方法中更改对象的属性,由于它是相同的对象,它将更改原始对象。
Call Method(ByVal variable)
+---------+
| |
variable +----------> | Object |
| |
+---+-----+
^
Sub Method (ByVal p) |
p +------------------+ 'If you change p here, it does NOT change variable.
End Sub
Call Method(ByRef variable)
+---------+
| |
+-----> variable +----------> | Object |
| | |
| +---------+
|
| Sub Method (ByRef p)
+---------+ p 'If you change p here, it DOES change variable.
End Sub