Язык программирования C#9 и платформа .NET5
public Car(string pn, int cs, out bool inDanger){petName = pn;currSpeed = cs;if (cs > 100){inDanger = true;}else{inDanger = false;}}Как обычно, должны соблюдаться все правила, касающиеся параметров
. В приведенном примере параметруoutпотребуется присвоить значение до завершения конструктора.inDangerЕще раз о стандартном конструкторе
Как вы только что узнали, все классы снабжаются стандартным конструктором. Добавьте в свой проект новый файл по имени
с показанным ниже определением классаMotorcycle.cs:Motorcycleusing System;namespace SimpleClassExample{class Motorcycle{public void PopAWheely(){Console.WriteLine("Yeeeeeee Haaaaaeewww!");}}}Теперь появилась возможность создания экземпляров
с помощью стандартного конструктора:MotorcycleConsole.WriteLine("***** Fun with Class Types *****\n");Motorcycle mc = new Motorcycle();mc.PopAWheely();...Тем не менее, как только определен специальный конструктор с любым числом параметров, стандартный конструктор молча удаляется из класса и перестает быть доступным. Воспринимайте это так: если вы не определили специальный конструктор, тогда компилятор C# снабжает класс стандартным конструктором, давая возможность пользователю размещать в памяти экземпляр вашего класса с набором полей данных, которые установлены в корректные стандартные значения. Однако когда вы определяете уникальный конструктор, то компилятор предполагает, что вы решили взять власть в свои руки.
Следовательно, если вы хотите позволить пользователю создавать экземпляр вашего типа с помощью стандартного конструктора, а также специального конструктора, то должны явно переопределить стандартный конструктор. Важно понимать, что в подавляющем большинстве случаев реализация стандартного конструктора класса намеренно оставляется пустой, т.к. требуется только создание объекта со стандартными значениями. Обновите класс
:Motorcycleclass Motorcycle{public int driverIntensity;public void PopAWheely(){for (int i = 0; i <= driverIntensity; i++){Console.WriteLine("Yeeeeeee Haaaaaeewww!");}}// Вернуть стандартный конструктор, который будет.// устанавливать все члены данных в стандартные значенияpublic Motorcycle() {}// Специальный конструктор.public Motorcycle(int intensity){driverIntensity = intensity;}}На заметку! Теперь, когда вы лучше понимаете роль конструкторов класса, полезно узнать об одном удобном сокращении. В Visual Studio и Visual Studio Code предлагается фрагмент кода
. Если вы наберетеctorи нажмете клавишу <ТаЬ>, тогда IDE-среда автоматически определит специальный стандартный конструктор. Затем можно добавить нужные параметры и логику реализации. Испытайте такой прием.ctorРоль ключевого слова this
В языке C# имеется ключевое слово
, которое обеспечивает доступ к текущему экземпляру класса. Один из возможных сценариев использованияthisпредусматривает устранение неоднозначности с областью видимости, которая может возникнуть, когда входной параметр имеет такое же имя, как и поле данных класса. Разумеется, вы могли бы просто придерживаться соглашения об именовании, которое не приводит к такой неоднозначности; тем не менее, чтобы проиллюстрировать такой сценарий, добавьте в классthisновое поле типаMotorcycle(под названиемstring), предназначенное для представления имени водителя. Затем добавьте методnameсо следующей реализацией:SetDriverName()class Motorcycle{public int driverIntensity;// Новые члены для представления имени водителя.public string name;public void SetDriverName(string name) => name = name;...}Хотя приведенный код нормально скомпилируется, компилятор C# выдаст сообщение с предупреждением о том, что переменная присваивается сама себе! В целях иллюстрации добавьте в свой код вызов метода
и обеспечьте вывод значения поля name. Вы можете быть удивлены, обнаружив, что значением поля name является пустая строка!SetDriverName()// Создать объект Motorcycle с мотоциклистом по имени Tiny?Motorcycle c = new Motorcycle(5);