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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top