Подтвердить что ты не робот

С# Когда использовать "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"?

Привет

4b9b3361

Ответ 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. Я бы не сказал, что это обязательно "лучшая" практика кодирования, я бы сказал, что это просто предпочтение.

Ответ 5

Поскольку вы используете символы подчеркивания, между именами нет конфликта; поэтому "this." является избыточным и может быть опущен. IL не будет затронут.

Пока не существует двусмысленности между полем и переменной/параретором, существует только один сценарий, в котором ключевое слово this (в контексте значения текущего экземпляра, а не ctor-chaining) строго необходимо - вызов метод расширения, который определяется отдельно:

this.SomeExtensionMethod();  // works
SomeExtensionMethod();  // fails

Ответ 6

Оба конструктора делают одно и то же в любом случае во втором, когда this является избыточным

Ответ 7

Вы можете использовать это, чтобы различать локальную переменную с именем X и поле/свойство уровня класса с тем же именем.

Ответ 8

Вам не следует использовать личные переменные _person и _parter. Это цель ваших геттеров и сеттеров.

Что касается конструкций, между ними нет реальной разницы. При этом я всегда предпочитаю использовать это ключевое слово, поскольку оно придает читабельности.