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