С# Когда использовать "This" Ключевое слово
Возможный дубликат:
Когда вы используете ключевое слово "this" ?
Здравствуйте,
Я понимаю, что ключевое слово This
используется для ссылки на экземпляр класса, однако предположим, что у меня есть класс с именем Life
, который определяет два поля, человека (их имя) и их партнера (их имя):
class Life
{
//Fields
private string _person;
private string _partner;
//Properties
public string Person
{
get { return _person; }
set { _person = value; }
}
public string Partner
{
get { return _partner; }
set { _partner = value; }
}
//Constructor 1
public Life()
{
_person = "Dave";
_partner = "Sarah";
MessageBox.Show("Life Constructor Called");
}
//Constructor 2
public Life()
{
this._person = "Dave";
this._partner = "Sarah";
MessageBox.Show("Life Constructor Called");
}
}
Есть ли разница между конструктором 1 и конструктором 2!?
Или просто лучше использовать кодировку для использования ключевого слова "this"?
Привет
Ответы
Ответ 1
Конструкторы одинаковы. Причина, по которой я предпочел бы вторую, заключается в том, что она позволит вам удалить символы подчеркивания из ваших личных имен переменных и сохранить контекст (улучшая понятность). Я делаю это практикой всегда использовать this
при обращении к переменным и свойствам экземпляра.
Я больше не использую ключевое слово this
таким образом, перейдя в другую компанию с разными стандартами. Я привык к этому и теперь редко использую его вообще, когда ссылаюсь на членов экземпляра. Я все же рекомендую использовать свойства (очевидно).
Моя версия вашего класса:
class Life
{
//Fields
private string person;
private string partner;
//Properties
public string Person
{
get { return this.person; }
set { this.person = value; }
}
public string Partner
{
get { return this.partner; }
set { this.partner = value; }
}
public Life()
{
this.person = "Dave";
this.partner = "Sarah";
MessageBox.Show("Life Constructor Called");
}
}
или, что еще лучше, но не так ясно, как использовать this
с полями.
class Life
{
//Properties
public string Person { get; set; }
public string Partner { get; set; }
public Life()
{
this.Person = "Dave";
this.Partner = "Sarah";
MessageBox.Show("Life Constructor Called");
}
}
Ответ 2
"this" также используется в .Net 3.5 с методами расширения:
public static class MyExtensions
{
public static string Extend(this string text)
{
return text + " world";
}
}
расширяет класс строк
var text = "Hello";
text.Extend();
Чтобы ответить на ваш вопрос: нет, нет разницы в ваших двух конструкторах. Imo, "this" загромождает код и должен использоваться только при необходимости, например. когда параметры и переменные поля имеют одинаковые имена.
Также существует случай, когда класс явно реализует интерфейс. Если вам нужно вызвать методы интерфейса из вашего класса, вам нужно будет отнести это к интерфейсу:
class Impl : IFace
{
public void DoStuff()
{
((IFace)this).SomeMethod();
}
void IFace.SomeMethod()
{
}
}
Ответ 3
В двух утверждениях нет разницы...
//These are exactly the same.
this._person
//and
_person
Ссылка на "this" подразумевается в случае _person. Я бы не сказал, что это обязательно "лучшая" практика кодирования, я бы сказал, что это просто предпочтение.
Ответ 4
Уже обсуждено
Когда вы используете ключевое слово "his" ?
Ответ 5
Поскольку вы используете символы подчеркивания, между именами нет конфликта; поэтому "this.
" является избыточным и может быть опущен. IL не будет затронут.
Пока не существует двусмысленности между полем и переменной/параретором, существует только один сценарий, в котором ключевое слово this
(в контексте значения текущего экземпляра, а не ctor-chaining) строго необходимо - вызов метод расширения, который определяется отдельно:
this.SomeExtensionMethod(); // works
SomeExtensionMethod(); // fails
Ответ 6
Оба конструктора делают одно и то же в любом случае во втором, когда this
является избыточным
Ответ 7
Вы можете использовать это, чтобы различать локальную переменную с именем X и поле/свойство уровня класса с тем же именем.
Ответ 8
Вам не следует использовать личные переменные _person и _parter. Это цель ваших геттеров и сеттеров.
Что касается конструкций, между ними нет реальной разницы. При этом я всегда предпочитаю использовать это ключевое слово, поскольку оно придает читабельности.