C sharp this keyword

Ключевое слово 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 = ", d); // Доступ к полю d с помощью обращения this.d WriteLine("Field d = ", this.d); // Field d = 25 > // Функция, в которой объявлена внутренняя переменная с именем d public void Print() < // Внутренняя переменная d - имя этой переменной совпадает с именем поля d int d = 77; // Вывести значение внутренней переменной d WriteLine("Internal d = ", d); // Доступ к полю d реализуется как this.d WriteLine("Field d = ", 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 .

Читайте также:  Ruby embedded in html

Задан класс 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 = , y1 = , x2 = , 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 = ", 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 , которое символизирует обращение к текущему экземпляру класса. Более подробно об особенностях использования индексаторов в классах можно прочитать здесь.

Читайте также:  Python write json to file pretty

Демонстрационный текст программы, созданной по шаблону 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 // в массиве как минимум 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($"\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 (C# Reference)

The this keyword refers to the current instance of the class and is also used as a modifier of the first parameter of an extension method.

This article discusses the use of this with class instances. For more information about its use in extension methods, see Extension Methods.

The following are common uses of this :

    To qualify members hidden by similar names, for example:

public int this[int param] < get < return array[param]; >set < array[param] = value; >> 

Static member functions, because they exist at the class level and not as part of an object, do not have a this pointer. It is an error to refer to this in a static method.

Читайте также:  Python iterate over months

Example

In this example, this is used to qualify the Employee class members, name and alias , which are hidden by similar names. It is also used to pass an object to the method CalcTax , which belongs to another class.

class Employee < private string name; private string alias; private decimal salary = 3000.00m; // Constructor: public Employee(string name, string alias) < // Use this to qualify the fields, name and alias: this.name = name; this.alias = alias; >// Printing method: public void printEmployee() < Console.WriteLine("Name: \nAlias: ", name, alias); // Passing the object to the CalcTax method by using this: Console.WriteLine("Taxes: ", Tax.CalcTax(this)); > public decimal Salary < get < return salary; >> > class Tax < public static decimal CalcTax(Employee E) < return 0.08m * E.Salary; >> class MainClass < static void Main() < // Create objects: Employee E1 = new Employee("Mingda Pan", "mpan"); // Display results: E1.printEmployee(); >> /* Output: Name: Mingda Pan Alias: mpan Taxes: $240.00 */ 

C# language specification

For more information, see the C# Language Specification. The language specification is the definitive source for C# syntax and usage.

See also

Источник

this (Справочник по C#)

Ключевое слово this ссылается на текущий экземпляр класса, а также используется в качестве модификатора первого параметра метода расширения.

В этой статье рассматривается использование this с экземплярами класса. Дополнительные сведения об использовании этого ключевого слова в методах расширения см. в разделе Методы расширения.

Ниже перечислены наиболее частые способы использования this .

    Для квалификации элементов, скрытых одинаковыми именами, например:

public int this[int param] < get < return array[param]; >set < array[param] = value; >> 

У статических функций-членов нет указателя this , так как они существуют только на уровне класса и не являются частями объектов. Использование ссылки на this в статическом методе является недопустимым.

Пример

В этом примере this используется для квалификации членов класса Employee , name и alias , которые скрыты одинаковыми именами. Это ключевое слово также используется для передачи объекта в метод CalcTax , который принадлежит другому классу.

class Employee < private string name; private string alias; private decimal salary = 3000.00m; // Constructor: public Employee(string name, string alias) < // Use this to qualify the fields, name and alias: this.name = name; this.alias = alias; >// Printing method: public void printEmployee() < Console.WriteLine("Name: \nAlias: ", name, alias); // Passing the object to the CalcTax method by using this: Console.WriteLine("Taxes: ", Tax.CalcTax(this)); > public decimal Salary < get < return salary; >> > class Tax < public static decimal CalcTax(Employee E) < return 0.08m * E.Salary; >> class MainClass < static void Main() < // Create objects: Employee E1 = new Employee("Mingda Pan", "mpan"); // Display results: E1.printEmployee(); >> /* Output: Name: Mingda Pan Alias: mpan Taxes: $240.00 */ 

Спецификация языка C#

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Источник

Оцените статью