2009-05-09 6 views
22

Possible en double:
When do you use the “this” keyword?C# Quand utiliser "Ce" Mot-clé

Bonjour, Je comprends que le mot-clé This est utilisé pour faire référence à une instance de la classe, mais , supposons que j'ai une classe appelée Life, qui définit deux champs, la personne (leur nom) et leur partenaire (leur nom) :

class Life 
{ 
    //Fields 
    private string _person; 
    private string _partner; 

    //Properties 
    public string Person 
    { 
     get { return _person; } 
     set { _person = value; } 
    } 

    public string Partner 
    { 
     get { return _partner; } 
     set { _partner = value; } 
    } 

    //Constructor 1 
    public Life() 
    { 
     _person = "Dave"; 
     _partner = "Sarah"; 

     MessageBox.Show("Life Constructor Called"); 
    } 

    //Constructor 2 
    public Life() 
    { 
     this._person = "Dave"; 
     this._partner = "Sarah"; 

     MessageBox.Show("Life Constructor Called"); 
    } 
} 

Existe-t-il une différence entre le constructeur 1 et le constructeur 2 !? Ou est-ce juste une meilleure pratique de codage pour utiliser le mot-clé "This"?

Observe

+0

Dup: http : //stackoverflow.com/questions/23250/when-do-you-use-the-this-keyword –

+0

Dup: http://stackoverflow.com/questions/479322/what-is-the-proper-use-of -keyword-this-in-private-class-members –

+1

@Marc: Ce n'est pas un Dup, c'est un Trip ... un triple! : P – Cerebrus

Répondre

22

Les constructeurs sont les mêmes. La raison pour laquelle je préférerais la seconde est qu'elle vous permettra de supprimer les traits de soulignement de vos noms de variables privées et de conserver le contexte (amélioration de la compréhensibilité). Je m'entraîne à toujours utiliser this en référence aux variables d'instance et aux propriétés.

Je n'utilise plus le mot-clé this de cette manière après avoir déménagé dans une autre société avec des normes différentes. Je me suis habitué et maintenant je ne l'utilise plus du tout en référence aux membres de l'instance. Je recommande toujours d'utiliser des propriétés (évidemment).

Ma version de votre classe:

class Life 
{ 
    //Fields 
    private string person; 
    private string partner; 

    //Properties 
    public string Person 
    { 
     get { return this.person; } 
     set { this.person = value; } 
    } 

    public string Partner 
    { 
     get { return this.partner; } 
     set { this.partner = value; } 
    } 


    public Life() 
    { 
     this.person = "Dave"; 
     this.partner = "Sarah"; 

     MessageBox.Show("Life Constructor Called"); 
    } 
} 

ou, encore mieux, mais pas aussi clair sur l'utilisation des this avec des champs.

class Life 
{ 

    //Properties 
    public string Person { get; set; } 
    public string Partner { get; set; } 

    public Life() 
    { 
     this.Person = "Dave"; 
     this.Partner = "Sarah"; 

     MessageBox.Show("Life Constructor Called"); 
    } 
} 
+0

Donc, le code que j'ai posté une ancienne façon de faire cela? Et le code que vous avez publié est-il le moyen le plus récent de le faire? Aussi ..... Puisque vous déclarez uniquement les propriétés et non les champs, comment le niveau de modificateur est-il défini pour les champs? ou est-il simplement défini comme privé? – Goober

+4

Le dernier exemple utilise les propriétés automatiques introduites dans C# 3.0 (VS2008). Citant le Guide de programmation C#: "Dans C# 3.0 et versions ultérieures, les propriétés implémentées automatiquement rendent la déclaration de propriété plus concise lorsqu'aucune logique supplémentaire n'est requise dans les accesseurs de propriété. Dans l'exemple suivant, le compilateur crée un champ de sauvegarde privé et anonyme accessible uniquement via les accesseurs get et set de la propriété. " Exemple omis. – tvanfosson

+0

Je me sens en utilisant le mot-clé 'this' quand redondant façon de verbeux et rend juste le code plus difficile à lire. Il devrait être évident quels sont le terrain et quels sont les habitants. Si ce n'est pas le cas, vous devez sortir des choses pour avoir des méthodes plus courtes. – vidstige

0

Vous pouvez l'utiliser pour la différence entre une variable locale nommée X et un champ de niveau de classe/propriété du même nom.

6

Il n'y a pas de différence dans les deux déclarations ...

//These are exactly the same. 

this._person 

//and 

_person 

La référence à « ce » est implicite dans le cas de _person. Je ne dirais pas que c'est forcément «meilleur» pratique de codage, je dirais que c'est juste une préférence.

+1

est d'accord sur le point re: préférence –

+0

Yup. Il n'y a rien de mal avec l'une ou l'autre syntaxe. – BlackWasp

+1

Je préfère la syntaxe de soulignement car elle est plus courte et comme l'a dit Brian, le trait de soulignement implique de toute façon "ceci". Le seul avantage que je dirais à l'utilisateur explicite de "ceci", c'est que s'il y a un problème d'ambiguïté, "ceci" le résoudra. Dans ces cas, j'ai tendance à utiliser «ceci» pour résoudre le problème en tant que cas particulier. –

0

Vous ne devriez pas utiliser les variables privées _person et _parter. C'est le but de vos getters et setters.

En ce qui concerne les constructions, il n'y a pas de réelle différence entre elles. Cela étant dit, je préfère toujours utiliser le mot-clé This comme il se prête à la lisibilité.

3

Étant donné que vous utilisez des traits de soulignement, il n'y a pas de conflit entre les noms; donc le "this." est redondant et peut être omis. L'IL ne sera pas affecté.Tant qu'il n'y a pas d'ambiguïté entre un champ et une variable/pararètre, il n'y a qu'un seul scénario dans lequel le mot clé this (dans le contexte de la signification de l'instance actuelle - pas ctor-chaining) est strictement nécessaire - invoquant un procédé d'extension qui est défini séparément:

this.SomeExtensionMethod(); // works 
SomeExtensionMethod(); // fails 
+0

Ah, je le vois maintenant. Curieux en effet. Mais compréhensible, puisque les méthodes d'extension sont toujours invoquées en relation avec un objet explicite. Sans "ceci", il semblerait que vous appeliez une méthode déclarée dans la classe en cours. Encore le compilateur devrait être capable de résoudre une telle méthode ... eh bien –

12

"this" est également utilisé dans Net 3.5 avec les méthodes d'extension:

public static class MyExtensions 
{  
    public static string Extend(this string text) 
    { 
     return text + " world"; 
    } 
} 

pourrait étendre la classe de chaînes

var text = "Hello"; 
text.Extend(); 

Pour répondre à votre question: non, il n'y a pas de différence entre vos deux constructeurs. Imo, le "ceci" encombre le code et ne doit être utilisé que lorsque cela est nécessaire, par ex. lorsque les paramètres et les variables de champ ont les mêmes noms.

Il existe également un cas où la classe implémente explicitement une interface. Si vous avez besoin d'appeler les méthodes d'interface de vous de votre classe doivent lancer ce à l'interface:

class Impl : IFace 
{ 

    public void DoStuff() 
    { 
     ((IFace)this).SomeMethod(); 
    } 

    void IFace.SomeMethod() 
    { 
    } 
} 
+0

Re "tu m'as battu dessus"; En fait, nous montrons 2 choses différentes. Je montre l'utilisation de "ceci" quand ** appelant ** une méthode d'extension - pas en définissant un.C'est une curiosité que le "ceci" soit nécessaire dans de tels cas. –

+0

+1 Acceptez que "this" encombre le code et soit redondant. – Vadim

1

Les deux constructeurs font la même chose de toute façon dans le second le this est redondant

Questions connexes