希望扩展BeginReceive
方法和MessageQueue.ReceiveCompleted
的事件处理程序,以便通过REFERENCE传递TCPClient
对象。照原样,我可以将其作为对象传入,但它将按VALUE传递,因此将是TCPClient
对象的副本。不行!
因此,我决定尝试编写自己的重载方法等。调试到.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#代码(。有什么快速访问这些东西的方法吗?
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