Question

Quelqu'un at-il un exemple utile d'attribution de cette dans une méthode C #? On me l'a demandé une fois lors d'un entretien d'embauche et je souhaite toujours y répondre moi-même.

Était-ce utile?

La solution

Les autres réponses sont incorrectes lorsqu'elles disent que vous ne pouvez pas attribuer à 'ceci'. Certes, vous ne pouvez pas pour un type de classe, mais vous pouvez pour un type de structure:

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

À tout moment, une structure peut se modifier elle-même en lui attribuant "this" comme ceci.

Autres conseils

l'utilisation du mot-clé this garantit que seules les variables et les méthodes définies dans le type actuel sont accessibles. Ceci peut être utilisé en cas de conflit de nom entre un champ / une propriété et une variable locale ou un paramètre de méthode.

Généralement utilisé dans les constructeurs:

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

Dans cet exemple, nous affectons le fournisseur de paramètres au fournisseur de champs privés.

L'endroit approprié pour cela du point de vue syntaxique, correspond à Méthodes d'extension en C # 3.0 lorsque vous spécifiez le premier paramètre de la méthode en tant que foo (tapez ceci, ...). et puis peut utiliser cette extension pour toute instance de ftype. Mais c’est juste la syntaxe et ce n’est pas une opération réelle.

si vous êtes invité à attribuer quelque chose à this , vous en trouverez plusieurs exemples. Un qui me vient à l’esprit est de dire à un contrôle qui est son papa:

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

Je sais que cette question a longtemps été répondue et que la discussion s'est arrêtée, mais voici un cas que je n'ai vu mentionné nulle part sur les interwebs et j'ai pensé qu'il pourrait être utile de le partager ici.

Je l’ai utilisé pour maintenir l’immuabilité des membres tout en prenant en charge la sérialisation. Considérons une struct définie comme ceci:

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
}

Etant donné que nous sommes autorisés à remplacer ce , nous pouvons maintenir l’immuabilité de _data dans une seule instance. Cela présente l’avantage supplémentaire que lors de la désérialisation de nouvelles valeurs, vous êtes assuré d’une nouvelle instance, ce qui est parfois une belle garantie!     }

Vous ne pouvez pas écraser "ceci". Il pointe vers l'instance d'objet en cours.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top