Ключевое слово this в C#

Использование this

В этой статье, я расскажу об использовании ключевого слова this в программах, написанных на C#. О том, для чего, как и когда его можно использовать. Сразу скажу, что почти всегда, можно обойтись без использования this, но «что это такое» знать нужно каждому программисту! И так, мы рассмотрим три контекста (случая, или варианта, если хотите) использования этого ключевого слова.

Вообще, ключевое слово this актуально «внутри класса», в его методах, свойствах и тому подомном.

Давайте рассмотрим, первый вариант использования. А заключается он в том, что иногда нам как бы нужно разрешить коллизии (неоднозначности) имен в конструктора и методах класса. Какие это могу быть неоднозначности? Да например, у метода или конструктора может быть аргумент с именем совпадающим с именем какого-то поля класса. Вот Вам например такого кода:

//Некий класс
class SomeClass
{
    //Конструктор
    public SomeClass(string name)
    {
        //Хотим присвоить значение аргумента, полю класса
        name = name;
    }

    //Поле класса
    private string name;
}

Обратите внимание на конструктор, в нем мы хотим присвоить полю «name» значение аргумента «name» (согласитесь, даже читать это предложение не удобно)… В результате ничего хорошего мы не получим, потому, что в единственной работающей строке тела конструктора, на самом деле значение аргумента «name» присваивается самому же аргументу «name», а не полю класса с таким именем! Вот тут на и поможет ключевое слово this, в данном случае, оно будет обозначать ссылку на сам объект, с которым работает система (в момент вызова конструктора создает). Слегка изменим код конструктора:

//Конструктор
public SomeClass(string name)
{
    //Присваиваем значение аргумента, полю класса
    this.name = name;
}

Вот теперь, мы на самом деле присваиваем значение аргумента полю класса, а не самому себе! А ключевое слово this используется словно ссылка на текущий объект как на самого себя.

Конечно, можно обойти эту проблему просто используя другое имя для аргумента конструктора, и этот вариант мне даже больше нравится. Я стараюсь давать имена аргументам методов и конструкторов начинающиеся с «a» или «an» словно неопределенный артикль в английском языке, т.е. имя аргумента конструктора, показанного выше, было бы таким: «aName».

Следующий случай использования ключевого слова this очень похож на предыдущий, он тоже заключается в том, что мы используем this как ссылку на объект, только теперь не для «собственных нужд», а для передачи в какой-то другой метод в качестве аргумента. Например так:

//Некий класс
class SomeClass
{
    //Закрытый статический метод, выводящий в консоль отладочное сообщение
    private static void WriteToLog(SomeClass aSomeObject)
    {
        Console.WriteLine("Обрабатывается объект с именем " + aSomeObject.name);
    }

    //Конструктор
    public SomeClass(string name)
    {
        //Хотим присвоить значение аргумента, полю класса
        this.name = name;
    }

    //Метод, выполняющий какую-то работу
    public void DoWork()
    {
        //Вывод отладочного сообщения
        WriteToLog(this);

        //Основная работа метода
    }

    //Поле класса
    private string name = "No name";
}

И вариант использования:

//Создание объекта с именем Иван
SomeClass tmpObj = new SomeClass("Иван");

//Выполнить работу
tmpObj.DoWork();

Если вставить эти фрагменты кода в новый проект, собрать его и запустить, то вы увидите что-то подобное…

Результат выполнения программы

Результат выполнения программы

Ну и третий вариант использования ключевого слова this — это использование его для вызова одного конструктора класса другим. Сейчас покажу что это такое. Но для начала давайте рассмотрим такой класс:

//Класс, для хранения целочисленного значения
class IntValue
{
    //Конструктор с аргументом
    public IntValue(int aValue)
    {
        value = aValue;
    }

    //Поле класса
    private int value;
}

Имея такой класс, мы можем создавать его объекты указывая конкретное значение полю «value» при создании объекта, но мы можем захотеть создавать объект без указания этого значения (с указанием значения по умолчанию, например нулем). Для этого можно написать еще один конструктор, конструктор без аргументов и в его теле явно обнулять значение поля:

//Конструктор без аргументов
public IntValue()
{
    value = 0;
}

И все будет работать, но если присмотреться, то можно увидеть, что конструктор без аргументов не что иное как частный вариант использования первого конструктора. Т.е. вызов конструктора с аргументом равны нулю! Так зачем нам разрабатывать конструктор без аргументов с нуля (в нашем случае, он до безобразия прост, но в реальной практике, всё может быть значительно сложнее)? И действительно мы можем просто вызвать из конструктора без аргументов, конструктор с аргументом, явно указав при вызове ноль в качестве входного параметра. И тут мы будем использовать ключевое слово this:

//Доработанный конструктор без аргументов
public IntValue() : this(0)
{ }

Видите, все просто, конструктор получился с пустым телом, но мы явно вызвали другой конструктор (который и сделал всю работу), после круглых скобок мы поставили символ «:» и за ним вызвали конструктор (тот что с одним аргументом) этого  же класса используя ключевое слово this. Полный код класса представлен ниже:

//Класс, для хранения целочисленного значения
class IntValue
{
    //Конструктор с аргументом
    public IntValue(int aValue)
    {
        value = aValue;
    }

    //Доработанный конструктор без аргументов
    public IntValue() : this(0)
    { }

    //Поле класса
    private int value;
 }

Вот мы и рассмотрели основные моменты связанные с использованием ключевого слова this в программах, написанных на C#. Естественно это не исчерпывающая информация, но для начало — самое то!

 

Добавить комментарий