Почему у С# нет частного пакета?

Я изучаю С# и исходя из 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, чтобы скрыть одного члена проекта от другого.