Что означает публичный конструктор во внутреннем классе

Я видел некоторый код C#, который объявляет класс с модификатором internal с конструктором public:

internal class SomeClass
{
    public SomeClass()
    {
    }
}

Какой смысл иметь открытый конструктор, если видимость всего класса является внутренней, поэтому его можно увидеть только внутри определяющей сборки?

Кроме того, имеет ли это смысл, если SomeClass является вложенным классом?


person lysergic-acid    schedule 11.05.2013    source источник
comment
Если вы создаете внутренний UserControl с внутренним конструктором, конструктор Win Forms будет работать неправильно.   -  person DaveShaw    schedule 11.05.2013
comment
Думайте о модификаторе доступа в классе как о своего рода главном переключателе, который устанавливает максимальную доступность для всех членов класса.   -  person Matthew Watson    schedule 11.05.2013
comment
@КрисМакГрат. В целом я бы согласился, хотя этот вопрос также касается вложенности классов (и я пропустил это при первом чтении, поэтому я обратился к нему при редактировании своего ответа).   -  person Andy Brown    schedule 11.05.2013


Ответы (2)


Область internal class переопределяет область конструктора public MyClass(), делая конструктор internal.

Использование public в конструкторе упрощает обновление класса до public позже, но путает намерения. Я этого не делаю.

Изменить 3. Я пропустил часть вашего вопроса. Это все еще нормально, если ваш класс вложен. Вложение не имеет никакого значения, даже если оно вложено в частный класс в открытый класс в ... (см. Спецификация языка C# — 3.5.2 Домены специальных возможностей).

EDIT: И, насколько я помню, если ctor равен internal, его нельзя использовать в качестве универсального типа, где есть ограничение, требующее where T : new(), для этого потребуется конструктор public (ссылка Спецификация языка C# (версия 4.0) — 4.4.3 Связанные и несвязанные типы).

Редактировать 2: пример кода, демонстрирующий приведенное выше

class Program
{
    internal class InternalClass {
        internal InternalClass() { }
    }
    internal class InternalClassPublicCtor {
        public InternalClassPublicCtor() { }        
    }
    internal class GenericClass<T>
        where T : new() {}

    static void Main(string[] args) {
        GenericClass<InternalClass> doesNotCompile = new GenericClass<InternalClass>();
        GenericClass<InternalClassPublicCtor> doesCompile = new GenericClass<InternalClassPublicCtor>();
    }
}
person Andy Brown    schedule 11.05.2013
comment
я придерживаюсь того же мнения о запутанных намерениях, если у вас нет большого количества конструкторов, не должно быть слишком сложно изменить ваши конструкторы на общедоступные после обновления, и многие инструменты рефакторинга также предложат это - person Chris McGrath; 12.05.2013
comment
Чтобы внедрение зависимостей и отражение работали, вы должны пометить свои конструкторы как общедоступные, даже если ваш класс является внутренним. - person Pavel Levchuk; 05.12.2018

Из MSDN — Модификаторы доступа (Руководство по программированию на C#):

Обычно доступность члена не выше, чем доступность типа, который его содержит. Однако открытый член внутреннего класса может быть доступен извне сборки, если член реализует методы интерфейса или переопределяет виртуальные методы, определенные в общедоступном базовом классе.

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

Кроме того, предположим, что вы вдруг захотели, чтобы ваш внутренний класс стал общедоступным. Гораздо проще просто изменить модификатор доступа для класса, чем для всех членов.

person Ant P    schedule 11.05.2013