Какова потребность частного конструктора в C#?

Поскольку операция > имеет более высокий приоритет, чем ^, поэтому она эквивалентна true ^ (1>0), которая работает с одними и теми же типами (boolean ^ boolean).

14
задан devnull 28 May 2009 в 09:46
поделиться

10 ответов

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

32
ответ дан 1 December 2019 в 05:50
поделиться

Если вы знаете некоторые шаблон дизайна, это очевидно: Пример на Java (извините, я недостаточно хорошо знаю C #) с одноэлементным классом:

class Meh 
{
  private Meh() { }
  private static Meh theMeh = new Meh();
  public static Meh getInstance() { return theMeh; }
}
12
ответ дан 1 December 2019 в 05:50
поделиться

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

sealed class StaticClass {
     private StaticClass() {
     }
     public static void DoSomething() {
     }
}
11
ответ дан 1 December 2019 в 05:50
поделиться

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

  • Вы можете использовать его из статического фабричного метода внутри того же класса
  • Вы можете проделать некоторую общую работу внутри него, а затем вызвать его из другой конструкции
  • Вы можете используйте его, чтобы среда выполнения не добавляла пустую структуру автоматически
  • Его можно было использовать (хотя и частным образом) из некоторых насмешек и инструментов ORM (например, nhibernate)
7
ответ дан 1 December 2019 в 05:50
поделиться

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

public class Test(){

  private Test(){
  }

  void DoSomething(){
    // instance method
  }

  public static Test CreateCoolTest(){
    return new Test();
  }
}
2
ответ дан 1 December 2019 в 05:50
поделиться

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

  • Классы, содержащие только статические методы
  • Синглтоны
9
ответ дан 1 December 2019 в 05:50
поделиться

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

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

  • классы, содержащие только статические служебные методы
  • классы, содержащие только константы
  • перечисления, безопасные для типов
  • синглтоны
1
ответ дан 1 December 2019 в 05:50
поделиться

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

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

1
ответ дан 1 December 2019 в 05:50
поделиться

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

0
ответ дан 1 December 2019 в 05:50
поделиться

Частные конструкторы используются для предотвращения создания экземпляров класса, когда нет полей или методов экземпляра, таких как класс 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);
    }
}
2
ответ дан 1 December 2019 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: