Ключове слово this. Призначення. Особливості застосування в класах
Зміст
- 1. Визначення ключового слова this. Що означає ключове слово this в класі?
- 2. Випадки застосування ключового слова this у програмах на C#
- 3. Приклад використання this для доступу до поля класу з тіла методу
- 4. Приклад застосування this для виклику конструкторів класу
- 5. Передача методу посилання на поточний об’єкт. Приклад
- 6. Приклад використання ключового слова this для оголошення індексатора
- 7. У яких випадках в класі неможна застосовувати ключове слово this?
- Зв’язані теми
Пошук на інших ресурсах:
1. Визначення ключового слова this. Що означає ключове слово this в класі?
У методах класу може використовуватись ключове слово this. За визначенням, this – це є неявно присутнє посилання на поточний екземпляр класу, яке в класі має декілька корисних застосувань.
⇑
2. Випадки застосування ключового слова this у програмах на C#
Ключове слово this застосовується у наступних випадках.
- Якщо в методі класу використовується ім’я, яке співпадає з іменем поля класу.
- Якщо в класі є декілька конструкторів, то this застосовується для виклику головного конструктора з інших (перенаправлення на головний конструктор). Це здійснюється з метою уникнення дублювання коду.
- Якщо в метод потрібно передати посилання на поточний об’єкт. У цьому випадку при виклику методу вказується ключове слово this.
- Якщо в класі оголошується індексатор.
⇑
3. Приклад використання this для доступу до поля класу з тіла методу
У прикладі у класі Program оголошується два методи і два конструктори:
- конструктор Program() без параметрів;
- конструктор Program() з одним параметром. У цьому конструкторі продемонстровано використання this для ініціалізації поля класу;
- метод PrintInt() – демонструє доступ до поля класу, ім’я якого перекривається іменем параметру методу;
- метод PrintD() – демонструє доступ до поля класу, ім’я якого перекривається іменем внутрішньої змінної оголошеної в методі.
Текст програми наступний
using System; using static System.Console; // Підключити статичний клас System.Console namespace ConsoleApp2 { // Тема: Ключове слово this. Доступ до поля класу з методу. class Program { int d = 25; // поле класу з іменем d // Конструктор без параметрів Program() { } // Конструктор з 1 параметром, ім'я параметру d Program(int d) { this.d = d; // використання this для доступу до поля d } // Функція, яка виводить значення параметру та поля d public void PrintInt(int d) // ім'я параметру d співпадає з іменем поля d { // Доступ до параметру d WriteLine("Parameter d = {0}", d); // Доступ до поля d з допомогою this.d WriteLine("Field d = {0}", this.d); // Field d = 25 } // Функція, в якій оголошена внутрішня змінна з іменем d public void PrintD() { // Внутрішня змінна d - ім'я цієї змінної співпадає з іменем поля d int d = 77; // Вивести значення внутрішньої змінної d WriteLine("Internal d = {0}", d); // Доступ до поля d реалізується як this.d WriteLine("Field d = {0}", this.d); // Field d = 25 } static void Main(string[] args) { // Демонстрація використання ключового слова this // 1. Оголосити екземпляр класу Program Program pr = new Program(30); // виклик конструктора з 1 параметром // 2. Викликати метод PrintInt() pr.PrintInt(50); // 3. Викликати метод PrintD() pr.PrintD(); } } }
Результат роботи програми
Parameter d = 50 Field d = 30 Internal d = 77 Field d = 30
⇑
4. Приклад застосування this для виклику конструкторів класу
Ключове слово this може бути застосоване для виклику одного конструктора з іншого конструктора. Для класу, що містить декілька конструкторів, вибирається головний конструктор. Це є конструктор з найбільшою кількістю параметрів. Всі інші конструктори звертаються до цього головного конструктора з допомогою виклику this.
Задано клас Line, який визначає лінію, задану координатами двох крайніх точок (x1; y1), (x2; y2). У класі продемонстровано виклик конструкторів з допомогою ключового слова this.
У нашому випадку головний конструктор – це є конструктор з 4 параметрами.
Текст програми демонстрації класу Line наступний:
using System; using static System.Console; // Підключити статичний клас System.Console namespace ConsoleApp2 { // Тема: Ключове слово this. Виклик конструктора класу class Line { private int x1, y1, x2, y2; // Головний конструктор, має 4 параметри public Line(int x1, int y1, int x2, int y2) { // Використання this для доступу до полів this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; WriteLine("Line(int, int, int, int)"); } // Конструктор з 2 параметрами, // реалізує лінію, яка починається від початку координат. // У конструкторі використовується ключове слово this // для перенаправлення на конструктор з 4 параметрами. public Line(int x, int y) : this(0, 0, x, y) { WriteLine("Line(int, int)"); } // Конструктор без параметрів, реалізує лінію з координатами (0;0),(1;1) public Line() : this(1, 1) // перенаправлення на конструктор з 2 параметрами { WriteLine("Line()"); } // Метод, що виводить поля x1, y1, x2, y2 на екран public void Print() { WriteLine("Fields values: "); WriteLine($"x1 = {x1}, y1 = {y1}, x2 = {x2}, y2 = {y2}"); } } class Program { static void Main(string[] args) { // Продемонструвати виклики конструкторів з допомогою this WriteLine("Object l1:"); Line l1 = new Line(1, 3, 5, 6); l1.Print(); WriteLine("\nObject l2:"); Line l2 = new Line(3, 4); l2.Print(); WriteLine("\nObject l3:"); Line l3 = new Line(); l3.Print(); } } }
Результат роботи програми
Object l1: Line(int, int, int, int) Fields values: x1 = 1, y1 = 3, x2 = 5, y2 = 6 Object l2: Line(int, int, int, int) Line(int, int) Fields values: x1 = 0, y1 = 0, x2 = 3, y2 = 4 Object l3: Line(int, int, int, int) Line(int, int) Line() Fields values: x1 = 0, y1 = 0, x2 = 1, y2 = 1
⇑
5. Передача методу посилання на поточний об’єкт. Приклад
Якщо в метод класу потрібно передати поточний екземпляр цього класу, то використовується ключове слово this. У наведеному нижче прикладі ключове слово this застосовується в методі DisplayLengthOrigin() класу Point при виклику методу LengthOrigin() цього ж класу.
Демонстраційний текст застосунку типу Console Application наступний:
using System; using static System.Console; // Підключити статичний клас System.Console namespace ConsoleApp2 { // Тема: Ключове слово this. Передача в метод посилання на поточний об'єкт class Point { int x, y; // Конструктор з двома параметрами public Point(int x, int y) { this.x = x; this.y = y; } // Методи доступу double GetX() { return x; } double GetY() { return y; } void SetX(int x) { this.x = x; } void SetY(int y) { this.y = y; } // Метод, який обчислює відстань від точки pt до початку координат public double LengthOrigin(Point pt) { return Math.Sqrt(pt.GetX() * pt.GetX() + pt.GetY() * pt.GetY()); } // У цьому методі застосовується this для передачі поточного екземпляру // в метод LengthOrigin, // метод виводить на екран відстань від точки до початку координат public void DisplayLenthOrigin() { double len; // передача поточного екземпляру в LengthOrigin() len = LengthOrigin(this); WriteLine("The distance to the origin = {0:f3}", len); } } class Program { static void Main(string[] args) { Point pt = new Point(2, 5); pt.DisplayLenthOrigin(); } } }
Результат роботи програми:
The distance to the origin = 5.385
⇑
6. Приклад використання ключового слова this для оголошення індексатора
У прикладі реалізовано клас ArrayIntegers, що реалізує масив цілих чисел. Для доступу до елементу масиву використовується механізм індексаторів з допомогою ключового слова this, яке символізує звертання до поточного екземпляру класу. Більш детально про особливості використання індексаторів у класах можна прочитати тут.
Демонстраційний текст програми, створеної за шаблоном Console Application наведено нижче.
using System; using static System.Console; // Підключити статичний клас System.Console namespace ConsoleApp2 { // Тема: Ключове слово this. Оголошення індексатора. class ArrayIntegers { private int[] Array; // посилання на масив // Конструктор з 1 параметром - головний конструктор // - size - розмір масиву; // - defaultValue - аргумент за замовчуванням public ArrayIntegers(int size, int defaultValue = 0) { // 1. Перевірка на коректність вводу if (size <= 0) size = 1; // у масиві як мінімум 1 елемент // 2. Виділити пам'ять для масиву Array = new int[size]; // 3. Заповнити масив значеннями за замовчуванням for (int i = 0; i < Array.Length; i++) Array[i] = defaultValue; } // Конструктор без параметрів, // викликає конструктор з 2 параметрами з допомогою this public ArrayIntegers() : this(10, 0) // за замовчуванням - 10 елементів { } // Індексатор - доступ до елементу масиву за індексом, // тут використовується ключове слово this public int this[int index] { // аксесори get { return Array[index]; } set { Array[index] = value; } } // Метод виведення масиву на екран public void Print() { WriteLine("Array of integers:"); for (int i = 0; i < Array.Length; i++) Write($"{Array[i]}\t"); WriteLine(); } } class Program { static void Main(string[] args) { // 1. Оголосити екземпляр типу ArrayIntegers ArrayIntegers AI = new ArrayIntegers(5); // 2. Ініціалізувати екземпляр AI значеннями for (int i = 0; i < 5; i++) AI[i] = i * i; // 3. Вивести значення масиву AI на екран AI.Print(); } } }
Результат роботи програми
Array of integers: 0 1 4 9 16
⇑
7. У яких випадках в класі неможна застосовувати ключове слово this?
Ключове слово this неможна застосовувати:
- в статичних методах класу;
- в статичних класах.
Це пов’язано з тим, що статичні методи існують тільки на рівні класу і не пов’язані з екземплярами класу (об’єктами класу).
⇑
Зв’язані теми
- Поняття класу. Загальна форма оголошення класу. Об’єкт класу. Поля класу. Приклади. Ключове слово this
- Індексатори. Одновимірні та багатовимірні індексатори. Індексатори без базового масиву. Перевантаження індексаторів
⇑