Что является примером "этого" назначения в C #? - PullRequest
13 голосов
/ 16 сентября 2008

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

Ответы [ 6 ]

42 голосов
/ 16 сентября 2008

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

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

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

0 голосов
/ 28 мая 2014

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

Я использовал это для поддержания неизменности членов, при этом поддерживая сериализацию. Рассмотрим 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, хранящуюся в одном экземпляре. Это дает дополнительное преимущество: при десериализации новых значений вам гарантирован свежий экземпляр, что иногда является хорошей гарантией! }

0 голосов
/ 16 сентября 2008

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

class frmMain
{
    void InitializeComponents()
    {
        btnOK = new Button();
        btnOK.Parent = this;
    }
}
0 голосов
/ 16 сентября 2008

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

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

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

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

0 голосов
/ 16 сентября 2008

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

0 голосов
/ 16 сентября 2008

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

...