Подтвердить что ты не робот

Какая разница между открытым конструктором во внутреннем классе и внутренним конструктором?

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

4b9b3361

Ответ 1

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

Создание конструктора public имеет противоположный эффект (очевидно) и может быть разумным, если вы хотите, чтобы он мог создавать экземпляр типа везде, где он виден.

Кроме того, как вы уже отметили, небольшая разница заключается в том, что если конструктор internal, этот тип не может использоваться как общий тип аргумента для общего типа с ограничением where T : new(), поскольку это ограничение требует для конструктора public.

Ответ 2

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

Внешний код имеет доступ к этому объекту, но не может создать новый.

Assembly 1:

public class Exclusive
{
  internal Exclusive() {}
  public void DoSomething() {}
}

public class Factory
{
  public Exclusive GetExclusive() { return new Exclusive(); }
}

Assembly 2:

Factory MyFactory = new Factory();
Exclusive MyExclusive = MyFactory.GetExclusive(); // Object is created in Assembly 1
MyExclusive.DoSomething();

Exclusive MyExclusive = new Exclusive(); // Error: constructor is internal

В то время как внутренний класс не может использоваться вне сборки вообще:

Assembly 1:

internal class Exclusive
{
  public Exclusive() {}
  public void DoSomething() {}
}

public class Factory
{
  public Exclusive GetExclusive() { return new Exclusive(); }
}

Assembly 2:

Factory MyFactory = new Factory();
Exclusive MyExclusive = MyFactory.GetExclusive(); // Error: class Exclusive not found

Ответ 3

Наличие внутреннего или публичного конструктора для внутреннего типа будет эквивалентным с точки зрения видимости.

Ответ 4

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