this
Напишите класс Tin с полем int по имени size и конструктором Tin(int size), который делает this.size = size;. В Pine оставьте Main и постройте один tin через Tin t = new Tin(7);, затем напишите t.size. Держите оба типа в одном учебном файле, чтобы dotnet run оставался простым. Запустите через dotnet run. На экране должна появиться одна строка: 7. Параметр и поле делят имя size. Слово this называет поле на объекте, чтобы сохранение попало в нужное место. Использовать this, когда имена сталкиваются, — вот чему учит эта страница. Публичный стартовый класс оставьте с именем Pine.
Почему одно и то же имя требует this
На странице конструкторов параметр был n, а поле — size, поэтому size = n; было ясно. Здесь оба имени — size. Внутри конструктора голое size означает параметр. Написание size = size; копирует параметр на самого себя и оставляет поле в значении по умолчанию. Поле на объекте всё ещё нужно записать. Эта запись ставит this.size слева.
Откройте файл Pine. Имя стартового класса остаётся Pine. Эта страница стартер не переименовывает. Удалите остаток Box b = new Box(4);, если именно такой вызов из конструкторов всё ещё занимает весь Main. Удалите любой остаток класса Box. Удалите любую строку ReadLine. В файле, который вы оставляете, нет ожидания ввода.
Вне фигурных скобок Pine — но всё ещё в том же файле — напишите public class Tin. Внутри фигурных скобок объявите int size;. Затем напишите конструктор: Tin(int size) { this.size = size; }. На этой странице в Tin нет Main. Сохраните файл перед запуском.
Прочитайте присваивание ещё раз. Справа size — значение, пришедшее в параметр — здесь 7. Слева this.size — поле на строящемся объекте. После выполнения строки у того объекта size держит 7. Если убрать this. и оставить size = size;, экран позже покажет 0, потому что поле не менялось.
using System;
public class Tin
{
int size;
Tin(int size)
{
this.size = size;
}
}
Pine строит один tin
У Pine остаётся public static void Main(). Внутри Main напишите Tin t = new Tin(7);, затем Console.WriteLine(t.size);. Аргумент 7 становится параметром конструктора size. Конструктор сохраняет его через this.size = size;. Отдельная строка t.size = 7; на этой странице не нужна. На этой странице вы не пишете Box b = new Box(4);. То был урок про конструкторы.
using System;
public class Pine
{
public static void Main()
{
Tin t = new Tin(7);
Console.WriteLine(t.size);
}
}
public class Tin
{
int size;
Tin(int size)
{
this.size = size;
}
}
Прочитайте оставляемый файл сверху. using System; готовит короткие имена. public class Pine — стартер. public static void Main() — место, где среда выполнения начинает работу. Выражение new Tin(7) строит Tin и вызывает Tin(int size) с параметром, равным 7. Тело пишет this.size = size, поэтому поле объекта становится 7. Затем Main пишет t.size, и экран показывает 7.
Запустите через dotnet run. Программа пишет одну строку и останавливается. Она не ждёт, пока вы что-то наберёте. Если dotnet run ждёт, в файле всё ещё есть ReadLine. Удалите эту строку и оставьте в Pine new Tin(7) плюс запись, а в Tin — this.size = size;. Экран показывает 7. Если экран показывает 4, всё ещё выполняется остаточный путь new Box(4). Если экран показывает 0, тело конструктора, скорее всего, size = size; без this. — верните this. на левую сторону.
Если поставить void перед именем конструктора, это станет обычным методом, а не конструктором, и new Tin(7) не выполнит то тело так, как ожидает эта страница. Заголовок должен выглядеть как Tin(int size), не void Tin(int size).
this.size и size рядом
Короткая таблица держит два имени ясными, пока вы внутри конструктора.
📊 this.size vs size
| Name | What it means in Tin(int size) |
|---|---|
size alone |
the parameter that entered the constructor |
this.size |
the field on the object being built |
this.size = size; |
store the parameter into the field |
size = size; |
does not update the field |
Таблица — только напоминание. Набираемая строка, которую вы оставляете, — this.size = size; внутри конструктора, затем в Pine — Tin t = new Tin(7); и Console.WriteLine(t.size);. |
Сравнение со страницей конструкторов
На странице конструкторов Box(int n) { size = n; } работал, потому что n и size были разными словами. Та форма по-прежнему работает. Эта страница намеренно использует одно и то же слово дважды, чтобы понадобился this. Остаточное демо Box с size = n; — другой урок. Для этой страницы держите Tin и Pine и this.size = size;.
Написание только Console.WriteLine(t); не покажет чистое 7. Чтобы увидеть сохранённое число, напишите Console.WriteLine(t.size);. Ссылка на объект сама по себе — не значение поля.
В другие дни вы всё ещё можете выбрать другое имя параметра. Этот урок нарочно выбирает совпадающие имена. Не смешивайте n и this в одном демо Tin на этой странице. Одного ясного пути достаточно: совпадающие имена, this на поле, запись поля.
Два tin по-прежнему остаются отдельными
Каждый new Tin(...) снова запускает конструктор для отдельного объекта. Можно написать Tin a = new Tin(2); и Tin b = new Tin(9);, затем написать оба поля size. Каждый вызов делает this.size = size; на своём объекте. Два объекта не делят один слот size. Для этой проверки второй блок кода не нужен — поменяйте числа в Pine, когда уже увидели 7, или оставьте демо с одним tin как сохраняемый файл.
Если обе строки показывают 0, у конструктора слева всё ещё нет this. Если сборка не находит Tin при компиляции Pine, проверьте, что public class Tin лежит в том же файле.
Что эта страница оставляет методам экземпляра
Эта страница использует this только внутри конструктора, чтобы сохранить поле. Следующая страница — методы экземпляра — показывает методы, которые выполняются на объекте и могут читать или менять поля. Здесь оставайтесь на сохранении в конструкторе. Не изобретайте лишние методы на Tin для этого урока, если вы их ещё не знаете; цель урока — this.size = size, когда имена совпадают.
Не вкладывайте Tin внутрь фигурных скобок Pine. На этой странице два класса сидят как соседи в файле. Если в Pine всё ещё есть Box b = new Box(4); из демо конструкторов, а в этом файле нет класса Box, который вы хотите оставить, уберите эту строку. Держите Tin t = new Tin(7); и Console.WriteLine(t.size);. Сборка не изобретёт Box за вас, когда вы учите Tin.
Вы можете объявить int size;, написать Tin(int size) { this.size = size; } и построить через Tin t = new Tin(7); из Pine.Main. Запустите через dotnet run. Экран показывает 7. Слово this называет поле объекта, когда параметр носит то же имя. Вы передали число при построении, конструктор сохранил его через this, а запись доказала сохранение. Думайте о this как об указателе на строящийся объект, когда голое имя означало бы параметр. Pine остаётся дверью, которую вы открываете через dotnet run. Следующая страница — методы экземпляра, где методы на объекте используют поля после того, как объект уже существует.
Оставьте заголовок конструктора без void. Оставьте this. на поле. Оставьте запись на t.size. Эти три привычки — контрольная точка этой страницы, прежде чем идти дальше.
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху