Каков пример назначения "this" в С#?

Есть ли у кого-нибудь полезный пример назначения this внутри метода С#? Меня просили об этом один раз во время собеседования, и мне все еще интересно ответить самому себе.

Ответы

Ответ 1

Другие ответы неверны, если говорят, что вы не можете назначить 'this'. Правда, вы не можете использовать тип класса, но можете использовать тип структуры:

public struct MyValueType
{
    public int Id;
    public void Swap(ref MyValueType other)
    {
        MyValueType temp = this;
        this = other;
        other = temp;
    }
}

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

Ответ 2

используя ключевое слово this, обеспечивает доступ только к переменным и методам, охваченным текущим типом. Это можно использовать, когда у вас есть конфликт имен между полем/свойством и локальным параметром или параметром метода.

Обычно используется в конструкторах:

private readonly IProvider provider;
public MyClass(IProvider provider)
{
  this.provider = provider;
}

В этом примере мы назначаем поставщика параметров частному провайдеру поля.

Ответ 3

Вы не можете перезаписать "this". Он указывает на текущий экземпляр объекта.

Ответ 4

только правильное место для этого из синтаксической точки зрения, это методы расширения в С# 3.0, когда вы указываете первый параметр метода как foo (ftype this,...). и затем может использовать это расширение для любого экземпляра ftype. Но это просто синтаксис, а не реальная операция с овуверсией.

Ответ 5

если вас попросят присвоить что-то, есть немало примеров. Тот, кто приходит на ум, говорит контроль, который его папа:

class frmMain
{
    void InitializeComponents()
    {
        btnOK = new Button();
        btnOK.Parent = this;
    }
}

Ответ 6

"this" - ссылка на текущий экземпляр класса. Если у вас есть нестатический метод для класса, вы можете обратиться к текущему экземпляру класса, используя это:

 public class MyClass{

      public string SomeProperty {get;set;}
      public void GetSomeProperty(){
        return this.SomeProperty;
      }

}

Ответ 7

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

Я использовал это для поддержания неизменности членов, сохраняя при этом сериализацию. Рассмотрим a struct, определенный следующим образом:

public struct SampleStruct : IXmlSerializable
{
    private readonly int _data;

    public int Data { get { return _data; } }

    public SampleStruct(int data)
    {
         _data = data;
    }

    #region IXmlSerializableMembers

    public XmlSchema GetSchema() { return null; }

    public void ReadXml(XmlReader reader)
    {
        this = new SampleStruct(int.Parse(reader.ReadString()));
    }

    public void WriteXml(XmlWriter writer
    {
        writer.WriteString(data.ToString());
    }

    #endregion
}

Поскольку нам разрешено перезаписывать this, мы можем сохранить неизменность _data, хранящуюся в одном экземпляре. Это имеет дополнительное преимущество, когда при десериализации новых ценностей вам гарантирован новый экземпляр, что иногда является хорошей гарантией!   }