Использование двоеточия в заголовке конструктора С#

Ниже представлен конструктор struct с именем Complex с двумя переменными-членами: Real и Imaginary:

public Complex(double real, double imaginary) : this()
{
 Real = real;
 Imaginary = imaginary;
}

Какая польза от части после двоеточия в заголовке функции?

Ответ 1

Вы всегда можете позвонить одному конструктору из другого. Скажем, например:

public class mySampleClass
{
    public mySampleClass(): this(10)
    {
        // This is the no parameter constructor method.
        // First Constructor
    }

    public mySampleClass(int Age) 
    {
        // This is the constructor with one parameter.
        // Second Constructor
    }
}

this относится к одному классу, поэтому, когда мы говорим this(10), мы фактически имеем в виду выполнение метода public mySampleClass(int Age). Вышеупомянутый способ вызова метода называется инициализатором. В методе мы можем использовать как минимум один инициализатор.

В вашем случае он будет вызывать конструктор по умолчанию без каких-либо параметров

Ответ 2

Он назвал цепочку конструкторов - где он фактически вызывает другой конструктор (который в этом случае не принимает никаких параметров), а затем возвращается и выполняет какую-либо дополнительную работу в этом конструкторе (в этом случае устанавливая значения Real и Imaginary).

Ответ 3

Это конструктор-инициализатор, который вызывает другой экземпляр-конструктор непосредственно перед телом-конструктором. Существуют две формы инициализаторов конструктора: this и base.

base Инициализатор конструктора вызывает вызов конструктора экземпляра из прямого базового класса.

this Инициализатор конструктора вызывает вызов конструктора экземпляра из самого класса. Когда инициализатор конструктора не имеет параметров, вызывается конструктор без параметров.

class Complex
{
   public Complex() // this constructor will be invoked
   {    
   }

   public Complex(double real, double imaginary) : this()
   {
      Real = real;
      Imaginary = imaginary;
   }
}

Как правило, цепочка конструкторов конструктора может быть построена из конструкторов с меньшим количеством параметров для конструкторов с большим количеством параметров (путем предоставления значений по умолчанию):

class Complex
{
   public Complex() : this(0, 0)
   {    
   }

   public Complex(double real, double imaginary)
   {
      Real = real;
      Imaginary = imaginary;
   }
}

Ответ 4

: this() инструктирует компилятор вызывать конструктор по умолчанию класса перед выполнением кода, найденного в этом конструкторе. Если конструктор по умолчанию пуст, он не имеет фактического эффекта.

Ответ 5

Его цепочка конструкторов, которая вызывает конструктор по умолчанию или без параметров, который имеет тот же класс.

Ответ 6

Вызов конструктора по умолчанию полезен (и требуется) при определении структуры, использующей сокращенную запись С# для свойств. Например:

public struct Foo
{
    public int X{get;set;}

    public Foo(int x)
    {
        X = x;
    }
}

Компилятор вызовет ошибку здесь, потому что объект 'this' не может использоваться внутри конструктора для назначения X до тех пор, пока не будут назначены все поля структур. За кулисами поле автоматически создается как хранилище резервных копий для свойства X, а вызов конструктора по умолчанию для структуры инициализирует это поле (в этом случае значение по умолчанию равно 0).

См. этот вопрос для получения дополнительной информации: Автоматически реализованное свойство в структуре не может быть назначено