Почему у С# нет частного пакета?
Я изучаю С# и исходя из Java-мира, я был немного смущен, увидев, что у С# нет "частного пакета". Большинство комментариев, которые я видел относительно этой суммы, "Вы не можете этого сделать, язык не был разработан таким образом". Я также видел некоторые обходные пути, которые включают internal
и partial
вместе с комментариями, в которых упомянутые обходные пути противоречат языковому дизайну.
Почему С# был разработан таким образом? Кроме того, как бы я сделал что-то вроде следующего: у меня есть класс Product
и ProductInstance
. Единственный способ, которым я хочу создать ProductInstance
, - это метод factory в классе Product
. В Java я бы поставил ProductInstance
в тот же пакет, что и Product
, но создайте его конструктор package private
, чтобы доступ к нему имел только Product
. Таким образом, любой, кто хочет создать ProductInstance
, может сделать это только с помощью метода factory в классе Product
. Как выполнить то же самое в С#?
Ответы
Ответ 1
internal
- это то, что вам нужно. Это означает, что член доступен любому классу в той же сборке. Нет ничего плохого в использовании этого для этой цели (Product and ProductInstance), и это одна из тех вещей, для которых она была разработана. С# предпочел не делать пространств имен значимыми - они используются для организации, а не для определения того, какие типы могут видеть друг друга, как в java с приватным пакетом.
partial
ничего не похоже на internal
или package private
. Это просто способ разделить реализацию класса на несколько файлов, с некоторыми вариантами расширяемости, которые были выбраны для хорошей оценки.
Ответ 2
Пакеты действительно не существуют так же, как в Java. Пространства имен используются для организации кода и предотвращения конфликтов имен, но не для контроля доступа. Проекты/сборки могут использоваться для контроля доступа, но вы не можете иметь вложенные проекты/сборки, как вы можете, с пакетами.
Используйте internal
, чтобы скрыть одного члена проекта от другого.