Как смоделировать C ++ друг в C # и VB.NET? - PullRequest
7 голосов
/ 20 декабря 2010

Потому что иногда мне действительно нужен друг.

Я могу придумать следующие уловки:

  1. Оболочка только для чтения - как ReadOnlyCollection . Друг сохраняет указатель на изменяемый объект, в то время как все остальные могут получить доступ только к оболочке.
  2. Запись делегата - друг дает конструктору объекта ссылку на делегата в качестве одного из параметров, конструктор заполняет его адресом частного метода, который можно использовать для изменения объекта.
  3. Отражение - очевидно, плохая идея. Включено для полноты.
  4. Несколько сборок - соберите друзей в отдельную сборку и настройте методы модификатора internal.
  5. Предоставьте доступ к изменяемому объекту, но добавьте комментарии к методам модификаторов «Это метод инфраструктуры - не вызывайте его!»
  6. Вложенные классы.
  7. Добавьте атрибут System.ComponentModel.EditorBrowsable(System.ComponentModel. EditorBrowsableState.Never) к участнику, к которому у вас есть доступ только у друга, чтобы скрыть его от IntelliSense.
  8. Неявная реализация интерфейса - см. Комментарии.

Является ли этот список исчерпывающим? Может ли кто-нибудь отсортировать их в порядке уменьшения производительности? Порядок убывания аккуратности? Любые предложения, когда использовать какой?

Ответы [ 2 ]

6 голосов
/ 20 декабря 2010

Вы также можете использовать атрибут InternalsVisibleTo .

Для данной сборки A вы можете указать, какие другие сборки могут иметь доступ к внутренним типам A.

4 голосов
/ 20 декабря 2010

В c # Вложенные классы (например, частные классы) похожи на friend в c ++:

public class Root
{
   private int a; // accessible for friendroot

   public int b;

   public class FriendOfRoot
   {          
      public int d;
   }

}

Edit: Если приведенная здесь симуляция друга с вложенными классами полезна для васпо быстродействию он достаточно быстрый, как обычные классы (во время компиляции все будет определено, и нет проблем с кастингом и накладных расходов).

...