В чем необходимость частного конструктора в С#?

Для чего нужен частный конструктор в С#? Я получил это как вопрос для теста С#.

Ответы

Ответ 1

Например, если у вас есть класс, который должен быть создан только с помощью методов factory. Или если у вас есть перегрузки конструктора, а некоторые из них должны использоваться только другими конструкторами. Вероятно, и другие причины =)

Ответ 2

Если вы знаете какой-то шаблон дизайна, это очевидно: класс может создать новый экземпляр сам по себе и не позволить другим делать это. Пример в Java (я не знаю, С# достаточно, извините) с singleton-классом:

class Meh 
{
  private Meh() { }
  private static Meh theMeh = new Meh();
  public static Meh getInstance() { return theMeh; }
}

Ответ 3

Всякий раз, когда вы хотите предотвратить непосредственное создание экземпляра класса извне, вы будете использовать конструктор private. Например, перед С# 2.0, в котором были введены классы static, вы использовали конструктор private для выполнения примерно одного и того же:

sealed class StaticClass {
     private StaticClass() {
     }
     public static void DoSomething() {
     }
}

Ответ 4

Если вы хотите запретить пользователям вашего класса напрямую создавать экземпляр класса. Некоторые распространенные случаи:

  • Классы, содержащие только статические методы
  • Singletons

Ответ 5

Я могу вспомнить несколько применений для него:

  • Вы можете использовать его из статического метода factory внутри одного класса
  • Вы можете выполнить некоторую общую работу внутри него, а затем вызвать его из другой структуры структуры
  • Вы можете использовать его, чтобы предотвратить автоматическое добавление пустой структуры.
  • Он может использоваться (хотя и частный) из некоторых инструментов для издевательств и ORM (например, nhibernate)

Ответ 6

Например, когда вы предоставляете методы factory для управления конкретизацией...

public class Test(){

  private Test(){
  }

  void DoSomething(){
    // instance method
  }

  public static Test CreateCoolTest(){
    return new Test();
  }
}

Ответ 7

Частные конструкторы используются для предотвращения создания экземпляров класса, когда нет полей или методов экземпляра, таких как класс Math, или когда вызывается метод для получения экземпляра класса. Если все методы в классе статичны, подумайте о том, чтобы сделать весь класс статическим. Дополнительные сведения см. В разделе Статические классы и члены статического класса.

class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = System.Math.E;  //2.71828...
}

Ниже приведен пример класса с использованием частного конструктора.

public class Counter
{
    private Counter() { }
    public static int currentCount;
    public static int IncrementCount()
    {
        return ++currentCount;
    }
}

class TestCounter
{
    static void Main()
    {
        // If you uncomment the following statement, it will generate
        // an error because the constructor is inaccessible:
        // Counter aCounter = new Counter();   // Error

        Counter.currentCount = 100;
        Counter.IncrementCount();
        System.Console.WriteLine("New count: {0}", Counter.currentCount);
    }
}

Ответ 8

Пока эта ссылка связана с java, я думаю, это поможет вам понять причину, по которой идея почти такая же.

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

  • классы, содержащие только статические методы утилиты
  • классы, содержащие только константы
  • безопасные перечисления типов
  • одиночек

Ответ 9

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

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

Ответ 10

Я опаздываю на игру, но, прочитав все остальные ответы, я не вижу упоминания об этом использовании:

Я использую частные конструкторы в сценариях, где у меня несколько (общедоступных) конструкторов, и все они имеют общий код. С цепью конструктора код становится действительно опрятным и сухим.

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

Пример:

public class MyClass
{
    private readonly int _a;
    private readonly int _b;
    private readonly string _x;

    public MyClass(int a, int b, string x)
        : this(x)
    {
        _a = a;
        _b = b;
    }

    public MyClass()
        : this("(not set)")
    {
        // Nothing set here...
    }

    private MyClass(string x)
    {
        _x = x;
    }
}

Ответ 11

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

Итак, чтобы создать экземпляр класса в первый раз, пользователь вызывает имя_файла .static_method_name. В этом методе, поскольку объект класса еще не существует, статический метод внутренне вызывает частный конструктор и возвращает экземпляр класса.

Если экземпляр класса уже существует, то статический метод просто возвращает экземпляр вызывающему методу.

Ответ 12

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