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() – демонстрирует доступ к полю класса, имя которого перекрывается именем параметра метода;
  • метод Print() – демонстрирует доступ к полю класса, имя которого перекрывается именем внутренней переменной, объявленной в методе.

Текст программы следующий

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 Print()
    {
      // Внутренняя переменная 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. Вызвать метод Print()
      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 Set(int x) { this.x = x; }
    void Set(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 нельзя применять:

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

Это связано с тем, что статические методы существуют только на уровне класса и не связаны с экземплярами класса (объектами класса).

 


Связанные темы