Конструкторы
Напишите класс Box с полем int по имени size и конструктором Box(int n), который делает size = n;. В Pine оставьте Main и постройте один box через Box b = new Box(4);, затем напишите b.size. Держите оба типа в одном учебном файле, чтобы dotnet run оставался простым. Запустите через dotnet run. На экране должна появиться одна строка: 4. Число, которое вы передаёте в new, доходит до конструктора, и конструктор сохраняет его на объекте до того, как Main продолжит. Задать поле в момент построения — внутри конструктора — вот чему учит эта страница. Публичный стартовый класс оставьте с именем Pine.
Метод, который выполняется, когда new строит
У конструктора то же имя, что у класса. У него нет возвращаемого типа void и нет другого возвращаемого типа. Когда Main пишет new Box(4), C# строит объект и запускает этот конструктор с 4 как n. После того как конструктор закончит, переменная держит готовый объект. Вся работа этой страницы: передать значение в new, дать конструктору сохранить его в поле, затем написать поле, чтобы увидеть, что сохранение сработало.
Откройте файл Pine. Имя стартового класса остаётся Pine. Эта страница стартер не переименовывает. Удалите остаток c.fill = 3;, если именно такое присваивание Cup всё ещё занимает весь Main. Удалите любой остаток класса Cup. Удалите любую строку ReadLine. В файле, который вы оставляете, нет ожидания ввода.
Вне фигурных скобок Pine — но всё ещё в том же файле — напишите public class Box. Внутри фигурных скобок объявите int size;. Затем напишите конструктор: Box(int n) { size = n; }. На этой странице имя параметра не совпадает с size, чтобы присваивание было ясным без слова this. В Box на этой странице нет Main. Сохраните файл перед запуском.
Одна строка поля сама по себе не кладёт 4 в объект. Это делает тело конструктора, когда new его вызывает. Если пропустить конструктор и только объявить поле, позже new Box(4) не совпадёт, и сборка пожалуется на вызов. Держите в Box обе части: поле и конструктор, который в него пишет.
using System;
public class Box
{
int size;
Box(int n)
{
size = n;
}
}
Pine передаёт 4 в new Box
У Pine остаётся public static void Main(). Внутри Main напишите Box b = new Box(4);, затем Console.WriteLine(b.size);. Аргумент 4 уходит в параметр конструктора n. Отдельная строка b.size = 4; на этой странице не нужна — конструктор уже сохранил значение. Строка записи нужна, чтобы вы могли доверять работе конструктора без догадок. На этой странице вы не пишете c.fill = 3;. То был урок про поля.
using System;
public class Pine
{
public static void Main()
{
Box b = new Box(4);
Console.WriteLine(b.size);
}
}
public class Box
{
int size;
Box(int n)
{
size = n;
}
}
Прочитайте оставляемый файл сверху. using System; готовит короткие имена. public class Pine — стартер. public static void Main() — место, где среда выполнения начинает работу. Выражение new Box(4) строит Box и вызывает Box(int n) с n, равным 4. Тело пишет size = n, поэтому size того объекта становится 4. Затем Main пишет b.size, и экран показывает 4. Больше ничего печататься не должно.
Запустите через dotnet run. Программа пишет одну строку и останавливается. Она не ждёт, пока вы что-то наберёте. Если dotnet run ждёт, в файле всё ещё есть ReadLine. Удалите эту строку и оставьте в Pine new Box(4) плюс запись, а конструктор — в Box. Экран показывает 4. Если экран показывает 3, всё ещё выполняется остаточный путь c.fill = 3;. Если экран показывает ok, в файле может остаться старое демо Chip. Не переустанавливайте .NET SDK из‑за экрана с неверной строкой.
Если написать new Box() без аргумента, когда единственный конструктор ждёт int, сборка откажет. Совпадайте вызов со списком параметров конструктора. Если поставить void перед именем конструктора, это станет обычным методом, а не конструктором, и new Box(4) не выполнит то тело так, как ожидает эта страница. Заголовок должен выглядеть как Box(int n), не void Box(int n) и не static int Box(int n).
Сравнение с присваиванием после new
На странице полей вы писали c.fill = 3; после new Cup(). Это по-прежнему работает. Эта страница переносит сохранение внутрь конструктора, чтобы значение задавалось, пока объект строится. Остаточное демо Cup с c.fill = 3; — другой урок. Для этой страницы держите Box и Pine и new Box(4). Если в Pine всё ещё есть c.fill = 3;, а в этом файле нет класса Cup, уберите эту строку. Сборка не изобретёт Cup за вас.
Написание только Console.WriteLine(b); не покажет чистое 4. Чтобы увидеть сохранённое число, напишите Console.WriteLine(b.size);. Ссылка на объект сама по себе — не значение поля. Этот приём вы уже учили на странице полей; держите его здесь, когда проверяете работу конструктора.
В других программах вы всё ещё можете присвоить поле после new. Этот урок просто выбирает путь конструктора, чтобы первое полезное значение приходило в момент построения. Не смешивайте оба стиля в одном демо Pine на этой странице. Одного ясного пути достаточно: аргумент в new, сохранение в конструкторе, запись поля.
Два box, два size
Каждый new Box(...) снова запускает конструктор для отдельного объекта. Можно написать Box a = new Box(2); и Box b = new Box(9);, затем написать оба поля size. Первый вызов сохраняет 2 на одном объекте. Второй вызов сохраняет 9 на другом. Два объекта не делят один слот size.
using System;
public class Pine
{
public static void Main()
{
Box a = new Box(2);
Box b = new Box(9);
Console.WriteLine(a.size);
Console.WriteLine(b.size);
}
}
public class Box
{
int size;
Box(int n)
{
size = n;
}
}
Запустите снова через dotnet run. Экран должен показать 2 на одной строке и 9 на следующей. Каждый вызов конструктора сохранил свой аргумент на своём объекте. Написание Box b = a; не строит второй объект — когда нужны два size, пишите два вызова new Box(...). Копирование ссылки — не то же самое, что вызвать конструктор дважды.
Если обе строки показывают одно и то же число, проверьте, что каждый new передаёт разный аргумент и что вы пишете a.size и b.size в этом порядке. Если сборка останавливается на втором new, ищите пропущенную скобку или неверное имя класса из старой формы. Мелкие опечатки во втором вызове часты, когда вы вставляете первую строку и забываете сменить аргумент.
Что эта страница оставляет для this
Эта страница пишет size = n; с разными именами. Следующая страница — this — покажет, как говорить о собственном поле объекта, когда имена сталкиваются. Здесь оставайтесь с ясным именем параметра n. Не изобретайте this.size на этой странице, если уже не знаете его; цель урока — вызов конструктора из new. Слово this — следующая тема, а не требование для сохранения n в size сегодня.
Не вкладывайте Box внутрь фигурных скобок Pine. На этой странице два класса в файле — соседи. Если сборка не находит Box при компиляции Pine, проверьте, что public class Box лежит в том же файле. Если экран показывает 0, у конструктора может не быть присваивания, или Main всё ещё использует форму без аргумента, которая никогда не задаёт size — держите Box(int n) { size = n; } и new Box(4). Ноль на экране обычно значит, что поле осталось со значением по умолчанию, потому что сохранение не выполнилось.
Вы можете объявить int size;, написать Box(int n) { size = n; } и построить через Box b = new Box(4); из Pine.Main. Запустите через dotnet run. Экран показывает 4. Конструктор выполняется, когда new строит объект. Вы передали число в момент построения, конструктор сохранил его в поле, и запись доказала сохранение. Думайте о конструкторе как о подготовке, которая выполняется до того, как Main продолжит после new. Pine остаётся дверью, которую вы открываете через dotnet run. Следующая страница — this, где вы учите другой способ называть собственные поля объекта внутри его методов и конструкторов.
Держите заголовок конструктора без void. Держите аргумент у new. Держите запись на b.size. Эти три привычки — контрольная точка этой страницы перед тем, как идти дальше.
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху