#c# #namespaces
#c# #пространства имен
Вопрос:
Я хочу создать класс вне пространства имен, чтобы его модификатор доступа по умолчанию был ‘PRIVATE’. Я делаю вот так:
namespace KnowStructs
{
class Clas1 {}
}
class MyClass {}
Но все равно мой класс ‘MyClass’ упоминается как внутренний, когда я смотрю в Reflector.
Кто-нибудь может мне помочь.
Комментарии:
1. Хорошо, я получил ответ. Когда я объявляю вложенный класс, он по умолчанию является ЧАСТНЫМ. Но все же кто-нибудь может сказать, как определить класс вне пространства имен, чтобы его пространство имен по умолчанию было частным
2. Пожалуйста, перефразируйте свой вопрос: если для класса не предоставлен модификатор доступа, он «частный», и это верно также для вашего фрагмента кода. А внутренний означает, что к вашему классу нельзя получить доступ вне сборки.
3. что вы подразумеваете под «частным пространством имен»?
4. Привет, Абдул, пожалуйста, вставьте мой код и просто посмотрите dll, созданную в Reflector. На самом деле он внутренний.
Ответ №1:
Из-за уровней доступности:
Типы верхнего уровня, которые не вложены в другие типы, могут иметь только внутренний или общедоступный доступ. Доступность по умолчанию для этих типов является внутренней.
и:
Модификаторы доступа не разрешены в пространствах имен. Пространства имен не имеют ограничений доступа.
и для частного:
Закрытые члены доступны только в теле класса или структуры, в которой они объявлены
То есть ключевое слово private явно определено в терминах содержащего его класса или структуры.
Итак, что бы вы ни пытались сделать, я этого не понимаю. Как частный тип верхнего уровня может быть полезен? Никакой другой код не смог бы ссылаться на него (каким-либо образом, даже если бы у него были, например, статические фабричные методы).
Ответ №2:
Если разрешен частный класс, который не является вложенным типом, то что бы это значило? Если это более ограничительно, чем internal
тогда как бы вы его использовали или создали экземпляр. Любой вариант использования потребует, чтобы это было internal
как минимум. Я хотел бы посмотреть, как вы собираетесь его использовать.
Это просто не имеет логического смысла.
В то время как наличие частного вложенного класса ограничивает себя родительским классом, содержащим класс. Если бы это было так internal
, вы все равно смогли бы создать экземпляр внутри сборки.
Таким образом, для классов, не имеющих модификатора, это internal
по умолчанию для не вложенных типов и private
для вложенных типов, поскольку .Net всегда применяет максимально ограниченный доступ, когда модификатор не указан.
Ответ №3:
Вы можете создать класс internal
, если хотите, чтобы к нему были доступны только классы в вашем пространстве имен
Комментарии:
1. На самом деле это сделает его доступным для всей сборки, а не только для одного пространства имен. Кроме того, OP хочет это сделать
private
.