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

В языке C# имеется ключевое слово this, которое обеспечивает доступ к текущему экземпляру класса. Одно из возможных применений ключевого слова this состоит в том, чтобы разрешать неоднозначность контекста, которая может возникнуть, когда входящий параметр назван так же, как поле данных данного типа. Разумеется, в идеале необходимо просто придерживаться соглашения об именовании, которое не может привести к такой неоднозначности.

Чтобы продемонстрировать наглядное применение ключевого слова this, давайте рассмотрим следующий пример:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class MyClass
    {
        public char ch;

        // 2 метода использующие входной параметр ch, при
        // этом во втором методе используется ключевое слово this
        public void Method1(char ch)
        {
            ch = ch;
        }

        public void Method2(char ch)
        {
            this.ch = ch;
        }
    }

    class Program
    {
        static void Main()
        {
            char myCH = 'A';
            Console.WriteLine("Исходный символ {0}",myCH);

            MyClass obj = new MyClass();

            obj.Method1(myCH);
            Console.WriteLine("Использование метода без ключевого слова this: {0}", obj.ch);
            obj.Method2(myCH);
            Console.WriteLine("Использование метода c ключевым словом this: {0}", obj.ch);
            Console.ReadLine();
        }
    }
}
Использование ключевого слова this

Этот код нормально компилируется, но Visual Studio 2010 отобразит предупреждающее сообщение о том, что переменная присваивается сама себе в методе Method1(). Так же обнаружится, что значением поля ch осталась пустая строка при вызове первого метода! Эту ситуацию позволяет избежать как раз применение ключевого слова this, как это показано в примере в методе Method2().

Предупреждающее сообщение в Visual Studio 2010

Помимо небольшого выигрыша от использования this в неоднозначных ситуациях, это ключевое слово может быть полезно при реализации членов, поскольку такие IDE-среды, как SharpDevelop и Visual Studio 2010, включают средство IntelliSense, когда вводится this. Это может здорово помочь, когда вы забыли название члена класса и хотите быстро вспомнить его определение.

Constructor chaining

Другое применение ключевого слова this состоит в проектировании класса, использующего технику под названием сцепление конструкторов или цепочка конструкторов (constructor chaining). Этот шаблон проектирования полезен, когда имеется класс, определяющий несколько конструкторов. Учитывая тот факт, что конструкторы часто проверяют входящие аргументы на соблюдение различных бизнес-правил, возникает необходимость в избыточной логике проверки достоверности внутри множества конструкторов.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class MyClass
    {
        public byte Age;
        public string Name;

        public MyClass() { }
        // Создаем цепочку конструкторов
        public MyClass(string name) : this(name, 0)
        {
            Console.WriteLine("Поле Name");
        }

        public MyClass(byte age)  : this("", age)
        {
            Console.WriteLine("Поле age");
        }

        // Главный конструктор
        public MyClass(string name, byte age)
        {
            if (age > 25)
                age = 25;

            Name = name;
            Age = age;
        }    
    }

    class Program
    {
        static void Main()
        {
            MyClass obj = new MyClass(26);
            obj.Name = "Alexandr";

            Console.WriteLine("Имя - {0}; Возраст - {1}",obj.Name, obj.Age);

            Console.ReadLine();
        }
    }
}

Поток логики конструкторов в данном примере описан ниже:

В построении цепочки конструкторов замечательно то, что этот шаблон программирования работает с любой версией языка C# и платформой .NET. Однако если целевой платформой является .NET 4.0, можно еще более упростить задачу программирования за счет использования необязательных аргументов в качестве альтернативы традиционным цепочкам конструкторов.

Пройди тесты
Лучший чат для C# программистов