Ключевое слово this
Прежде чем завершать эту главу, необходимо представить ключевое слово this
. Когда метод вызывается, ему автоматически передается ссылка на вызывающий объект, т.е. тот объект, для которого вызывается данный метод. Эта ссылка обозначается ключевым словом this
. Следовательно, ключевое слово this
обозначает именно тот объект, по ссылке на который действует вызываемый метод. Для того чтобы стало яснее назначение ключевого слова this
, рассмотрим сначала пример программы, в которой создается класс Rect,
инкапсулирующий ширину и высоту прямоугольника и включающий в себя метод Area(),
возвращающий площадь прямоугольника.
using System;
class Rect {
public int Width;
public int Height;
public Rect(int w, int h) {
Width = w;
Height = h;
}
public int Area() {
return Width * Height;
}
}
class UseRect {
static void Main() {
Rect rl = new Rect(4, 5);
Rect r2 = new Rect(7, 9);
Console.WriteLine("Площадь прямоугольника rl: " + rl.Area());
Console.WriteLine("Площадь прямоугольника r2: " + r2.Area());
}
}
Как вам должно уже быть известно, другие члены класса могут быть доступны непосредственно без дополнительного уточнения имени объекта или класса. Поэтому оператор
return Width * Height;
в методе Area()
означает, что копии переменных Width и Height
, связанные с вызывающим объектом, будут перемножены, а метод возвратит их произведение. Но тот же самый оператор можно написать следующим образом.
return this.Width * this.Height;
В этом операторе ключевое слово this
обозначает объект, для которого вызван метод Area().
Следовательно, в выражении this.Width
делается ссылка на копию переменной Width
данного объекта, а в выражении this.Height
— ссылка на копию переменной Height
этого же объекта. Так, если бы метод Area()
был вызван для объекта х, то ключевое слово this
в приведенном выше операторе обозначало бы ссылку на объект х. Написание оператора без ключевого слова this
представляет собой не более чем сокращенную форму записи.
Ключевое слово this
можно также использовать в конструкторе. В этом случае оно обозначает объект, который конструируется. Например, следующие операторы в методе Rect()
Width = w;
Height = h;
можно было бы написать таким образом.
this.Width = w;
this.Height = h;
Разумеется, такой способ записи не дает в данном случае никаких преимуществ. Ради примера ниже приведен весь класс Rect
, написанный с использованием ссылки this.
using System;
class Rect {
public int Width;
public int Height;
public Rect(int w, int h) {
this.Width = w;
this.Height = h;
}
public int Area() {
return this.Width * this.Height;
}
}
class UseRect {
static void Main() {
Rect rl = new Rect(4, 5);
Rect r2 = new Rect(7, 9);
Console.WriteLine("Площадь прямоугольника rl: " + rl.Area());
Console.WriteLine("Площадь прямоугольника r2: " + r2.Area());
}
}
В действительности ключевое слово this
не используется приведенным выше способом в программировании на С#, поскольку это практически ничего не дает, да и стандартная форма записи намного проще и понятнее. Тем не менее ключевому слову this
можно найти не одно полезное применение. Например, в синтаксисе C# допускается называть параметр или локальную переменную тем же именем, что и у переменной экземпляра. В этом случае имя локальной переменной скрывает переменную экземпляра. Для доступа к скрытой переменной экземпляра и служит ключевое слово this
. Например, приведенный ниже код является правильным с точки зрения синтаксиса C# способом написания конструктора Rect().
public Rect(int Width, int Height) {
this.Width = Width; this.Height = Height;
}
В этом варианте написания конструктора Rect()
имена параметров совпадают с именами переменных экземпляра, а следовательно, скрывают их. Но для "обнаружения" скрытых переменных служит ключевое слово this.
Читать дальше