C#. Ключове слово this. Призначення. Особливості застосування в класах




Ключове слово this. Призначення. Особливості застосування в класах


Зміст


Пошук на інших ресурсах:

1. Визначення ключового слова this. Що означає ключове слово this в класі?

У методах класу може використовуватись ключове слово this. За визначенням, this – це є неявно присутнє посилання на поточний екземпляр класу, яке в класі має декілька корисних застосувань.

 

2. Випадки застосування ключового слова this у програмах на C#

Ключове слово this застосовується у наступних випадках.

  1. Якщо в методі класу використовується ім’я, яке співпадає з іменем поля класу.
  2. Якщо в класі є декілька конструкторів, то this застосовується для виклику головного конструктора з інших (перенаправлення на головний конструктор). Це здійснюється з метою уникнення дублювання коду.
  3. Якщо в метод потрібно передати посилання на поточний об’єкт. У цьому випадку при виклику методу вказується ключове слово this.
  4. Якщо в класі оголошується індексатор.

 

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 неможна застосовувати:

  • в статичних методах класу;
  • в статичних класах.

Це пов’язано з тим, що статичні методи існують тільки на рівні класу і не пов’язані з екземплярами класу (об’єктами класу).

 


Зв’язані теми