this (Справочник по C#)
Ключевое слово this ссылается на текущий экземпляр класса, а также используется в качестве модификатора первого параметра метода расширения.
В этой статье рассматривается использование this с экземплярами класса. Дополнительные сведения об использовании этого ключевого слова в методах расширения см. в разделе Методы расширения.
Ниже перечислены наиболее частые способы использования this .
-
Для квалификации элементов, скрытых одинаковыми именами, например:
public class Employee < private string alias; private string name; public Employee(string name, string alias) < // Use this to qualify the members of the class // instead of the constructor parameters. this.name = name; this.alias = alias; >>
CalcTax(this);
public int this[int param] < get < return array[param]; >set < array[param] = value; >>
У статических функций-членов нет указателя this , так как они существуют только на уровне класса и не являются частями объектов. Использование ссылки на this в статическом методе является недопустимым.
Пример
В этом примере this используется для квалификации членов класса Employee , name и alias , которые скрыты одинаковыми именами. Это ключевое слово также используется для передачи объекта в метод CalcTax , который принадлежит другому классу.
class Employee < private string name; private string alias; private decimal salary = 3000.00m; // Constructor: public Employee(string name, string alias) < // Use this to qualify the fields, name and alias: this.name = name; this.alias = alias; >// Printing method: public void printEmployee() < Console.WriteLine("Name: \nAlias: ", name, alias); // Passing the object to the CalcTax method by using this: Console.WriteLine("Taxes: ", Tax.CalcTax(this)); > public decimal Salary < get < return salary; >> > class Tax < public static decimal CalcTax(Employee E) < return 0.08m * E.Salary; >> class MainClass < static void Main() < // Create objects: Employee E1 = new Employee("Mingda Pan", "mpan"); // Display results: E1.printEmployee(); >> /* Output: Name: Mingda Pan Alias: mpan Taxes: $240.00 */
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
См. также
- this параметры стиля кода (IDE0003 и IDE0009)
- Справочник по C#
- Руководство по программированию на C#
- Ключевые слова в C#
- base
- Методы
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Ключевое слово this в java [закрыт]
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.
Закрыт 4 года назад .
Я начал изучать java и натолкнулся на слово this но не очень понял для чего оно нужно. Но я уже знаю python и у меня возник вопрос слово this в java тоже самое, что и слово self в python ?
Отслеживать
задан 15 июн 2019 в 8:22
21 3 3 бронзовых знака
В целом да. Можете почитать похожий ответ о сравнении this из C++ и self из Python – this из Плюсов очень похож на this из Java, только там это указатель, а в Джаве ссылка.
15 июн 2019 в 8:34
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В Java слово this используется в двух разных значениях.
1) Когда оно используется как переменная объектного типа, типа this.value = 5; , оно означает тот объект, к которому относится код, использующий this . Используется это для разрешения неоднозначности, когда, например, есть поле объекта и локальная переменная с одинаковыми именами, тогда просто qq++ означает инкремент локальной переменной qq , а this.qq++ означает инкремент одноименного поля объекта. Иногда может использоваться просто для повышения читабельности. Довольно часто можно встретить такое его использование в конструкторах, когда имена параметров конструктора совпадают с именами полей, такого вот типа:
class Person < private String name; // Поля объекта private int age; // Создаём объект с заданными значениями полей public Person(String name, int age) < // При вызове зададим начальные значения в виде параметров this.name = name; // Значения этих параметров this.age = age; // присваиваются переменным объекта >>
Понятно, что в статических методах его использовать нельзя, так как статические методы не принадлежат какому-то отдельному объекту.
2) Оно может использоваться в конструкторе в форме вызова метода, типа this(someValue) , и тогда оно означает вызов другого конструктора этого же класса. Используется для сокращения кода, когда двум разным конструкторам нужно выполнить одни и те же действия, напр.
class Person < private String name; // Поля объекта private int age; public Person(String name, int age) < // Создаём объект с заданными значениями полей this.name = name; // Значения параметров this.age = age; // присваиваются переменным объекта >public Person() < // Создаём объект с некими дефолтными значениями this("NoName", -1); // Вызов другого конструктора >>
В этом примере задача второго конструктора — просто обеспечить какие-то значения полей, если их не предоставил пользователь. С этими значениями второй конструктор вызывает первый конструктор, который присваивает полученные значения соответствующим полям.
P.S. Да, ответ про C++, упомянутый в комментарии AivanF, напомнил мне еще один важный момент — использование this — это единственный способ для объекта передать себя в качестве параметра при вызове метода или вернуть себя в качестве результата выполнения метода:
public MyClass registeredSelf() < registrator.register(this); // Зарегистрируйте меня this.registered = true; return this; >
Ключевое слово this
Иногда требуется, чтобы метод ссылался на вызвавший его объект. Ключевое слово this в Java используется в теле любого метода для ссылки на текущий объект.
Рассмотрим конструктор, в котором параметры имеют те же имена, что и переменные класса. В этом случае параметры перекрывают область видимости переменных класса и мы не можем напрямую обратится к переменным класса. Чтобы это сделать используется ключевое слово this:
Box(double width, double height, double depth)
В этом примере использование ключевого слова this не является необходимым — можно обойтись и без него:
Box(double w, double h, double d)
2. Использование ключевого слова this() в конструкторе
Второй вариант использования ключевого слова this() — с его помощью можно вызвать один конструктор из другого. Вызов this() может находиться только в первой строчке конструктора:
public class Toy < String name; int cost; String manufacturer; int age; public Toy(String name, int cost, String manufacturer, int age) < this(name, cost, manufacturer); this.age = age; System.out.println("В конструкторе с четырьмя параметрами"); >public Toy(String name, int cost, String manufacturer) < this(); this.name = name; this.cost = cost; this.manufacturer = manufacturer; System.out.println("В конструкторе с тремя параметрами"); >public Toy() < System.out.println("В конструкторе по умолчанию"); >>
public class ToyDemo < public static void main(String[] args) < Toy toy = new Toy("Кукла", 34, "Disney", 3); >>
В конструкторе по умолчанию В конструкторе с тремя параметрами В конструкторе с четырьмя параметрами
- Процедурное и объектно-ориентированное программирование
- Принципы ООП
- Классы и объекты
- Конструктор
- Перегрузка
- Стек и куча
- Передача объектов в методы
- Java varargs
- Рекурсия
- Сборщик мусора и метод finalize
- Наследование
- Ключевое слово super
- Модификаторы доступа
- Геттеры и сеттеры
- Переопределение методов
- Абстрактные классы и методы
- Ключевое слово final
- Задания
Для чего необходимо ключевое слово this

Использование 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()
И все будет работать, но если присмотреться, то можно увидеть, что конструктор без аргументов не что иное как частный вариант использования первого конструктора. Т.е. вызов конструктора с аргументом равны нулю! Так зачем нам разрабатывать конструктор без аргументов с нуля (в нашем случае, он до безобразия прост, но в реальной практике, всё может быть значительно сложнее)? И действительно мы можем просто вызвать из конструктора без аргументов, конструктор с аргументом, явно указав при вызове ноль в качестве входного параметра. И тут мы будем использовать ключевое слово this:
//Доработанный конструктор без аргументов public IntValue() : this(0)
Видите, все просто, конструктор получился с пустым телом, но мы явно вызвали другой конструктор (который и сделал всю работу), после круглых скобок мы поставили символ «:» и за ним вызвали конструктор (тот что с одним аргументом) этого же класса используя ключевое слово this. Полный код класса представлен ниже:
//Класс, для хранения целочисленного значения class IntValue < //Конструктор с аргументом public IntValue(int aValue) < value = aValue; >//Доработанный конструктор без аргументов public IntValue() : this(0) < >//Поле класса private int value; >
Вот мы и рассмотрели основные моменты связанные с использованием ключевого слова this в программах, написанных на C#. Естественно это не исчерпывающая информация, но для начало — самое то!
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.