Почему C # не имеет частного пакета? - PullRequest
10 голосов
/ 11 февраля 2011

Я изучаю C # и пришел из мира Java, я был немного озадачен, увидев, что C # не имеет «частного пакета».Большинство комментариев, которые я видел относительно этой суммы: «Вы не можете сделать это; язык не был разработан таким образом».Я также видел некоторые обходные пути, включающие internal и partial, а также комментарии, в которых говорилось, что эти обходные пути идут вразрез с дизайном языка.

Почему C # был разработан таким образом?Кроме того, как бы я сделал что-то вроде следующего: у меня есть класс Product и класс ProductInstance.Единственный способ, которым я хочу создать ProductInstance, - это использовать фабричный метод в классе Product.В Java я бы поместил ProductInstance в тот же пакет, что и Product, но сделал бы его конструктор package private, чтобы только Product имел к нему доступ.Таким образом, любой, кто хочет создать ProductInstance, может сделать это только через фабричный метод в классе Product.Как бы я сделал то же самое в C #?

Ответы [ 2 ]

26 голосов
/ 11 февраля 2011

internal это то, что вы после.Это означает, что член доступен любому классу в той же сборке.Нет ничего плохого в том, чтобы использовать его для этой цели (Product & ProductInstance), и это одна из вещей, для которой он был разработан.C # решил не делать пространства имен значимыми - они используются для организации, а не для определения того, какие типы могут видеть друг друга, как в java с package private .

partial совсем не похоже на internal или package private.Это просто способ разделить реализацию класса на несколько файлов с некоторыми опциями расширения, добавленными для хорошей меры.

7 голосов
/ 11 февраля 2011

Пакеты на самом деле не существуют так же, как в Java. Пространства имен используются для организации кода и предотвращения конфликтов имен, но не для контроля доступа. Проекты / сборки могут использоваться для контроля доступа, но вы не можете иметь вложенные проекты / сборки, как вы можете с пакетами.

Используйте internal, чтобы скрыть участников одного проекта от другого.

...