Доступ к внутренним классам для унаследованного типа - PullRequest
0 голосов
/ 09 декабря 2018

Нужно расширить метод 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 #).Есть ли быстрый способ получить доступ к этому материалу?

1 Ответ

0 голосов
/ 09 декабря 2018

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
...