На этом шаге мы рассмотрим назначение и использование этого ключевого слова.
Мы уже знаем, что если в программном коде метода встречается название поля, то имеется в виду поле того объекта, из которого вызывается метод. Концептуальная проблема кроется в том, что при вызове метода из объекта этот объект обычно "принимает участие" в работе метода: метод может использовать поля и другие методы объекта. Когда мы описываем метод в классе, то определяем команды, выполняемые при вызове метода. Но на этапе описания класса объектов еще нет (ведь нельзя создать объект на основе класса, которого не существует - сначала нужно описать класс). Получается, что когда мы описываем метод, то, с одной стороны, команды метода могут быть связаны с объектом, из которого вызывается метод, а с другой стороны, такого объекта на момент описания метода нет. Если речь идет об использовании полей (или других методов) объекта, то действует правило, упомянутое выше: имя поля в коде метода означает поле объекта, из которого вызывается метод. Но далеко не всегда дело ограничивается использованием полей. Часто нужно получить доступ к объекту как таковому. Выход из ситуации находят в использовании специального зарезервированного ключевого слова this, обозначающего объект, из которого вызывается метод. Это ключевое слово в теле метода используется так же, как и любая объектная переменная. Просто нужно помнить, что речь идет о том объекте, из которого вызывается метод, содержащий данное ключевое слово.
Допустим, в программе описан такой класс:
class MyClass { public int code; public int get() { return code; } }
В этом классе описано целочисленное поле code и метод get(), который результатом возвращает значение поля code. В описании метода get() ссылка на поле дается его названием code. Вместе с тем мы могли бы использовать и полную ссылку this.code, в которой объект, из которого вызывается метод, явно указан с помощью ключевого слова this:
class MyClass { public int code; public int get() { return this.code; } }
В данном случае использование ключевого слова this не является обязательным. По бывают ситуации, когда без него не обойтись. Рассмотрим еще один способ описания класса:
class MyClass { public int code; public void set(int n) { code = n; } }
Теперь в классе MyClass кроме поля code описан метод set() с целочисленным аргументом n, который присваивается значением полю code. Команда
code = n;
class MyClass { public int code; public void set(int code) { this.code = code; } }
В теле метода set() инструкция this.code означает поле code объекта, из которого вызывается метод, а идентификатор code означает аргумент метода.
Небольшой пример, в котором используется ключевое слово this, представлен ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr88_1 { class MyClass { // Закрытое целочисленное поле: private int code; // Открытый метод: public int get() { // Использовано ключевое слозо this: return this.code; } // Открытый метод: public void set(int code) { // Использовано ключевое слово this: this.code = code; } // Конструктор: public MyClass(int code) { // Использовано ключевое слово this: this.code = code; // Использовано ключевое слово this: Console.WriteLine("Создан объект: " + this.get()); } } // Класс с главным методом: class Program { static void Main() { // Создание объекта: MyClass obj = new MyClass(100); // Присваивание значения полю: obj.set(200); // Проверка значения поля: Console.WriteLine("Новое значение: " + obj.get()); // Задержка: Console.ReadLine(); } } }
Результат выполнения программы такой.
Рис.1. Результат выполнения программы
Пример очень простой. В классе MyClass есть закрытое целочисленное поле code. Значение полю присваивается методом set(), аргумент которого имеет такое же название, как и имя поля. Поэтому в теле метода при обращении к полю используется полная ссылка this.code. То же замечание справедливо и для конструктора, аргумент которого назван как code. Поэтому в теле конструктора идентификатор code обозначает аргумент, а инструкция this.code является обращением к полю объекта, для которого вызван конструктор. Ключевое слово code использовано еще в нескольких местах, хотя острой необходимости в этом не было (имеется в виду инструкция this.code в теле метода get() и инструкция this.get() в теле конструктора).
В главном методе создается объект obj класса MyClass. При вызове конструктора значение поля созданного объекта отображается в консольном окне. Затем с помощью метода set() полю объекта присваивается новое значение, а с помощью метода get() выполняется проверка значения поля.
На следующем шаге мы закончим изучение этого вопроса.