C # конструктор цепочки? (Как это сделать?)

Я знаю, что это, предположительно, очень простой вопрос, но я уже некоторое время борюсь с этой концепцией. Мой вопрос: как вы связываете конструкторы в c #? Я нахожусь в своем первом classе ООП, поэтому я просто изучаю. Я не понимаю, как работает цепочка конструкторов или как его реализовать, или даже почему это лучше, чем просто делать конструкторы без цепочки.

Я хотел бы получить несколько примеров с объяснением.

Так как же их цепочки? Я знаю, что с двумя идет:

public SomeClass this: {0} public SomeClass { someVariable = 0 } 

Но как вы это делаете с тремя, четырьмя и так далее?

Опять же, я знаю, что это вопрос начинающего, но я изо всех сил пытаюсь понять это, и я не знаю, почему.

Вы используете стандартный синтаксис (используя this метод, как метод), чтобы выбрать перегрузку внутри classа:

 class Foo { private int id; private string name; public Foo() : this(0, "") { } public Foo(int id, string name) { this.id = id; this.name = name; } public Foo(int id) : this(id, "") { } public Foo(string name) : this(0, name) { } } 

тогда:

 Foo a = new Foo(), b = new Foo(456,"def"), c = new Foo(123), d = new Foo("abc"); 

Также обратите внимание:

  • вы можете привязать к конструкторам базового типа с использованием base(...)
  • вы можете добавить дополнительный код в каждый конструктор
  • по умолчанию (если вы ничего не укажете) используется base()

Для “почему?”:

  • сокращение кода (всегда хорошая вещь)
  • необходимо вызвать базовый конструктор без дефолта, например:

     SomeBaseType(int id) : base(id) {...} 

Обратите внимание, что вы также можете использовать инициализаторы объектов аналогичным образом (хотя ничего не нужно писать):

 SomeType x = new SomeType(), y = new SomeType { Key = "abc" }, z = new SomeType { DoB = DateTime.Today }; 

Я просто хочу рассказать о том, кто это ищет. Если вы собираетесь работать с версиями .NET до версии 4.0 (VS2010), пожалуйста, имейте в виду, что вам необходимо создать цепочки конструкторов, как показано выше.

Однако, если вы останетесь в 4.0, у меня есть хорошие новости. Теперь у вас может быть один конструктор с необязательными аргументами! Я упрощу пример classа Foo:

 class Foo { private int id; private string name; public Foo(int id = 0, string name = "") { this.id = id; this.name = name; } } class Main() { // Foo Int: Foo myFooOne = new Foo(12); // Foo String: Foo myFooTwo = new Foo(name:"Timothy"); // Foo Both: Foo myFooThree = new Foo(13, name:"Monkey"); } 

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

Надеюсь, вам понравился этот урок! Я просто не могу поверить, что разработчики жалуются на цепочку построения и не могут использовать необязательные аргументы по умолчанию с 2004/2005! Теперь он занимает много времени в мире разработки, что разработчики боятся использовать его, потому что он не будет обратно совместим.

Это лучше всего иллюстрируется примером. Imaging у нас есть class Person

 public Person(string name) : this(name, string.Empty) { } public Person(string name, string address) : this(name, address, string.Empty) { } public Person(string name, string address, string postcode) { this.Name = name; this.Address = address; this.Postcode = postcode; } 

Итак, здесь у нас есть конструктор, который задает некоторые свойства и использует цепочку конструкторов, чтобы вы могли создать объект только с именем или просто с именем и адресом. Если вы создадите экземпляр с просто именем, это приведет к отправке значения по умолчанию, string.Empty through к имени и адресу, который затем отправляет значение по умолчанию для почтового индекса через конечный конструктор.

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

У меня есть class дневника, и поэтому я не пишу настройки значений снова и снова

 public Diary() { this.Like = defaultLike; this.Dislike = defaultDislike; } public Diary(string title, string diary): this() { this.Title = title; this.DiaryText = diary; } public Diary(string title, string diary, string category): this(title, diary) { this.Category = category; } public Diary(int id, string title, string diary, string category) : this(title, diary, category) { this.DiaryID = id; } 

Вы спрашиваете об этом?

  public class VariantDate { public int day; public int month; public int year; public VariantDate(int day) : this(day, 1) {} public VariantDate(int day, int month) : this(day, month,1900){} public VariantDate(int day, int month, int year){ this.day=day; this.month=month; this.year=year; } } 

Что такое «Цепочка конструктора»?
Вы используете его для вызова одного конструктора из другого конструктора.

Как реализовать «цепочку конструкторов»?
Используйте ключевое слово “: this (yourProperties)” после определения конструктора. например:

 Class MyBillClass { private DateTime requestDate; private int requestCount; public MyBillClass() { /// ===== we naming "a" constructor ===== /// requestDate = DateTime.Now; } public MyBillClass(int inputCount) : this() { /// ===== we naming "b" constructor ===== /// /// ===== This method is "Chained Method" ===== /// this.requestCount= inputCount; } } 

Почему это полезно?
Важной причиной является сокращение кодирования и предотrotation дублирования кода. например, повторный код для инициализации свойства. Предположим, что некоторое свойство в classе должно быть инициализировано с определенным значением (в нашем примере, requestDate). А class имеет 2 или более конструктора. Без «Constructor Chain» вы должны повторить код инициализации во всех создателях classа.

Как это работает? (Или, что такое последовательность выполнения в «Цепочке конструктора»)?
в приведенном выше примере сначала будет выполняться метод «a», а затем последовательность команд вернется к методу «b». Другими словами, выше код равен ниже:

 Class MyBillClass { private DateTime requestDate; private int requestCount; public MyBillClass() { /// ===== we naming "a" constructor ===== /// requestDate = DateTime.Now; } public MyBillClass(int inputCount) : this() { /// ===== we naming "b" constructor ===== /// // ===== This method is "Chained Method" ===== /// /// *** --- > Compiler execute "MyBillClass()" first, And then continue instruction sequence from here this.requestCount= inputCount; } } 

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

Кстати, я использовал LINQPad для этого примера, если вам интересно, что такое * .Dump ().
ура

 void Main() { CtorChaining ctorNoparam = new CtorChaining(); ctorNoparam.Dump(); //Result --> BaseDir C:\Program Files (x86)\Default\ CtorChaining ctorOneparam = new CtorChaining("c:\\customDir"); ctorOneparam.Dump(); //Result --> BaseDir c:\customDir } public class CtorChaining { public string BaseDir; public static string DefaultDir = @"C:\Program Files (x86)\Default\"; public CtorChaining(): this(null) {} public CtorChaining(string baseDir): this(baseDir, DefaultDir){} public CtorChaining(string baseDir, string defaultDir) { //if baseDir == null, this.BaseDir = @"C:\Program Files (x86)\Default\" this.BaseDir = baseDir ?? defaultDir; } } 

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

Я мог бы, например, иметь переменную backing, которая получает значение по умолчанию моим конструктором по умолчанию, но может быть перезаписана.

 public class MyClass { private IDependency _myDependency; MyClass(){ _myDependency = new DefaultDependency(); } MYClass(IMyDependency dependency) : this() { _myDependency = dependency; //now our dependency object replaces the defaultDependency } } 
  • В чем разница между инициализатором объекта и конструктором?
  • Что такое конструктор по умолчанию для указателя на C ++?
  • Инициализируются ли поля перед кодом конструктора на Java?
  • Нет ли скобок в конструкторе без аргументов в качестве языка?
  • Соответствуют ли скобки после имени типа с новым?
  • Объем переменных в операторах if
  • Когда вам нужно явно вызвать конструктор суперclassа?
  • Статические методы фабрики против экземпляров (обычных) конструкторов?
  • Что такое блок инициализации?
  • Как вы используете конструктор, отличный от стандартного для члена?
  • C ++: где инициализировать переменные в конструкторе
  • Interesting Posts

    Что вызовет открытие окна CMD после запуска окон?

    Не удалось установить пароль администратора в OOBE-pass после возврата из режима аудита при автоматической установке

    Как удалить функциональность подразделения из репозиториев с помощью IOC

    Установка программного обеспечения Windows программно

    Как вставить pg_backend_pid из postgresql в сценарий оболочки и передать его другому процессу?

    Как связать файлы без расширения в Windows 7?

    Android: Как открыть конкретную папку через Intent и показать ее содержимое в файловом браузере?

    Безопасно ли просто устанавливать CheckForIllegalCrossThreadCalls на false, чтобы избежать ошибок сквозной streamовой передачи во время отладки?

    Разделить текстовую строку в столбцах data.table

    Как рассчитывается соединение в Firebase

    Обнаружение объекта Tensorflow на своем собственном наборе данных

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

    NoClassDefFoundError на зависимость от Maven

    Реализация вложенных функций

    Как предотвратить обман системы в MS Office (и других приложениях)

    Давайте будем гением компьютера.