Шаг 88.
Язык программирования C#. Начала
Знакомство с классами и объектами. Ключевое слово this

    На этом шаге мы рассмотрим назначение и использование этого ключевого слова.

    Мы уже знаем, что если в программном коде метода встречается название поля, то имеется в виду поле того объекта, из которого вызывается метод. Концептуальная проблема кроется в том, что при вызове метода из объекта этот объект обычно "принимает участие" в работе метода: метод может использовать поля и другие методы объекта. Когда мы описываем метод в классе, то определяем команды, выполняемые при вызове метода. Но на этапе описания класса объектов еще нет (ведь нельзя создать объект на основе класса, которого не существует - сначала нужно описать класс). Получается, что когда мы описываем метод, то, с одной стороны, команды метода могут быть связаны с объектом, из которого вызывается метод, а с другой стороны, такого объекта на момент описания метода нет. Если речь идет об использовании полей (или других методов) объекта, то действует правило, упомянутое выше: имя поля в коде метода означает поле объекта, из которого вызывается метод. Но далеко не всегда дело ограничивается использованием полей. Часто нужно получить доступ к объекту как таковому. Выход из ситуации находят в использовании специального зарезервированного ключевого слова 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;
в теле метода пока особых вопросов не вызывает. Подавайте представим, что мы захотели назвать аргумент метода set() точно так же, как название поля code. Сразу возникает вопрос: если мы в теле используем идентификатор code, то что подразумевается - поле или аргумент? Ответ однозначный и состоит в том, что в таком случае идентификатор code будет отождествляться с аргументом метода. А как же тогда обратиться к одноименному полю? И вот здесь пригодится ючевое слово this:
  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() выполняется проверка значения поля.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг