Как скрыть инкапсуляцию в C #? - PullRequest
1 голос
/ 02 апреля 2009

Socket.Dispose() недоступный член. Однако мы можем обойти это, выполнив следующее:

((IDisposible)Socket).Dispose()

Два вопроса:

  1. Почему это разрешено?
  2. Как это работает внутри?

Ответы [ 2 ]

5 голосов
/ 02 апреля 2009

Я считаю, что эта функция является "явной реализацией интерфейса". Использование этого позволит только вызывать реализованные методы, если объект явно приведен к интерфейсу.

Вот учебник по этому вопросу:

http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

3 голосов
/ 02 апреля 2009

Всякий раз, когда класс реализует метод, такой как Close (), который выполняет ту же работу, что и Dispose (), рекомендуется явно реализовать интерфейс IDisposable, так что разработчик обычно будет видеть только метод Close (), но пока метод Dispose по-прежнему доступен через интерфейс IDisposable для использования средой, в которой ожидается метод Dispose.

Иногда имеет смысл по существу выставлять Dispose под другим именем, например Close, где это делает для более читабельного кода. Вы видите их в .NET Framework с такими вещами, которые могут быть «закрыты», такими как дескрипторы файлов и соединения.

Редактировать: см. http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...