Qual è un esempio di "questo" compito in C#?
-
09-06-2019 - |
Domanda
Qualcuno ha un esempio utile di this
assegnazione all'interno di un metodo C#?Mi è stato chiesto una volta durante un colloquio di lavoro e sono ancora interessato a rispondere io stesso.
Soluzione
Le altre risposte sono errate quando dicono che non è possibile assegnare a "questo".È vero, non puoi per un tipo di classe, ma tu Potere per un tipo di struttura:
public struct MyValueType
{
public int Id;
public void Swap(ref MyValueType other)
{
MyValueType temp = this;
this = other;
other = temp;
}
}
In qualsiasi momento una struttura può alterarsi assegnando a "this" in questo modo.
Altri suggerimenti
usando il Questo La parola chiave garantisce l'accesso solo alle variabili e ai metodi con ambito nel tipo corrente.Può essere utilizzato quando si verifica un conflitto di denominazione tra un campo/proprietà e una variabile locale o un parametro del metodo.
Tipicamente utilizzato nei costruttori:
private readonly IProvider provider;
public MyClass(IProvider provider)
{
this.provider = provider;
}
In questo esempio assegniamo il provider di parametri al provider di campo privato.
l'unico posto corretto per questo dal punto di vista della sintassi sono i metodi di estensione in C# 3.0 quando si specifica il primo parametro del metodo come foo(ftype this, ...).e quindi è possibile utilizzare questa estensione per qualsiasi istanza di ftype.Ma è solo sintassi e non è reale questa operazione completa.
se ti viene chiesto di assegnare qualcosa a Questo, ci sono parecchi esempi.Uno che mi viene in mente è dire a un controllo chi è suo padre:
class frmMain
{
void InitializeComponents()
{
btnOK = new Button();
btnOK.Parent = this;
}
}
So che a questa domanda è stata data risposta da tempo e la discussione si è interrotta, ma ecco un caso che non ho visto menzionato da nessuna parte negli interweb e ho pensato che potesse essere utile condividerlo qui.
L'ho usato per mantenere l'immutabilità dei membri pur supportando la serializzazione.Consideriamo a struct
definito così:
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
}
Dal momento che ci è permesso sovrascrivere this
, possiamo mantenere l'immutabilità di _data
tenuto in un'unica istanza.Ciò ha l'ulteriore vantaggio di quando si deserializzano nuovi valori ti viene garantita una nuova istanza, che a volte è una bella garanzia!}
Non puoi sovrascrivere "questo".Punta all'istanza dell'oggetto corrente.