Ключевое слово this в C#: разбор всех сценариев использования
Освоение ключевого слова this в C#
Изучите универсальное ключевое слово this в C# через краткие объяснения и реальные примеры кода.
В C# this ссылается на текущий экземпляр класса. Оно незаменимо для различения полей экземпляра и параметров методов, вызова перегруженных конструкторов, передачи текущего объекта другим методам и объявления индексаторов.
using System;
namespace ThisKeyword {
class Test {
int num;
Test(int num) {
// this.num ссылается на поле экземпляра
this.num = num;
Console.WriteLine("object of this: " + this);
}
static void Main(string[] args) {
Test t1 = new Test(4);
Console.WriteLine("object of t1: " + t1);
Console.ReadLine();
}
}
}
Вывод
object of this: ThisKeyword.Test object of t1: ThisKeyword.Test
И t1, и this ссылаются на один экземпляр; их строковые представления совпадают.
Разрешение конфликта имен
Поля экземпляра и параметры могут иметь одинаковое имя, но без this компилятор считает ссылку параметром, оставляя поле нетронутым.
using System;
namespace ThisKeyword {
class Test {
int num;
Test(int num) {
num = num; // присваивает параметр самому себе, поле остается 0
}
static void Main(string[] args) {
Test t1 = new Test(4);
Console.WriteLine("value of num: " + t1.num);
Console.ReadLine();
}
}
}
Вывод
0
Результат 0, так как присваивание не затрагивает поле. Использование this снимает неопределенность:
using System;
namespace ThisKeyword {
class Test {
int num;
Test(int num) {
// this.num ссылается на поле экземпляра
this.num = num;
}
static void Main(string[] args) {
Test t1 = new Test(4);
Console.WriteLine("value of num: " + t1.num);
Console.ReadLine();
}
}
}
Вывод
value of num: 4
Цепочка конструкторов с this
Когда класс предлагает несколько конструкторов, один может вызывать другой для централизации логики инициализации. Это делается ключевым словом this после двоеточия в сигнатуре конструктора.
using System;
namespace ThisKeyword {
class Test {
Test(int num1, int num2) {
Console.WriteLine("Constructor with two parameters");
}
// вызывает двухпараметровый конструктор
Test(int num) : this(33, 22) {
Console.WriteLine("Constructor with one parameter");
}
public static void Main(string[] args) {
Test t1 = new Test(11);
Console.ReadLine();
}
}
}
Вывод
Constructor with two parameters Constructor with one parameter
Однопарамтерный конструктор сначала выполняет двухпараметровый, затем продолжает свое тело. Этот паттерн, называемый цепочкой конструкторов (constructor chaining), сохраняет логику инициализации DRY.
Передача текущего экземпляра в методы
Иногда методу нужно оперировать объектом, который его вызвал. Использование this как аргумента делает намерение явным.
using System;
namespace ThisKeyword {
class Test {
int num1;
int num2;
Test() {
num1 = 22;
num2 = 33;
}
// метод, принимающий экземпляр Test
void PassParameter(Test t) {
Console.WriteLine("num1: " + t.num1);
Console.WriteLine("num2: " + t.num2);
}
void Display() {
// передача текущего экземпляра
PassParameter(this);
}
public static void Main(string[] args) {
Test t1 = new Test();
t1.Display();
Console.ReadLine();
}
}
}
Вывод
num1: 22 num2: 33
Так как this представляет вызывающий экземпляр, метод может безопасно обращаться к его приватным полям.
Объявление индексатора с this
Индексаторы позволяют обращаться к объектам как к массивам. Ключевое слово this объявляет сигнатуру индексатора.
using System;
namespace ThisKeyword {
class Student {
private string[] names = new string[3];
// Объявление индексатора
public string this[int index] {
get { return names[index]; }
set { names[index] = value; }
}
}
class Program {
public static void Main() {
Student s = new Student();
s[0] = "Ram";
s[1] = "Shyam";
s[2] = "Gopal";
for (int i = 0; i < 3; i++) {
Console.WriteLine(s[i]);
}
}
}
}
Вывод
Ram Shyam Gopal
Приватный массив names доступен через индексатор, сохраняя инкапсуляцию и предлагая массивоподобный синтаксис.
Для глубокого погружения в индексаторы см. официальную документацию Microsoft: C# Indexer.
Язык C
- Ключевое слово static в C#: статические переменные, методы и классы
- Ключевое слово global в Python: как и когда использовать
- Ключевое слово this в Java: практическое применение, конструкторы и примеры
- Ключевое слово final в Java: переменные, методы и классы
- Тестирование датчика температуры DS18B20 на Raspberry Pi
- Coded UI Test: комплексное руководство для начинающих по фреймворку автоматизации
- Turck TB3-CP80: Точный тест-бокс для индуктивных, магнитных, емкостных и фотоэлектрических датчиков
- Магнитный тестовый щуп Pomona MP1 — 4 мм защитная гнездо, угловой, для точной промышленной диагностики
- Быстрый смартфон-тест COVID-19 дает результаты с высокой точностью за 10 минут
- Летающий зонд (FPT): профессиональное руководство по надежной верификации функциональности печатных плат