2009-05-09 28 views
22

Duplicar posibles:
When do you use the “this” keyword?C# Cuándo debe usar el palabra "this"

Hola, entiendo que la palabra clave This se utiliza para referirse a una instancia de la clase, sin embargo , supongamos que tengo una clase llamada Life, que define dos campos, la persona (su nombre) y su socio (su nombre) :

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"); 
    } 
} 

¿Hay alguna diferencia entre el constructor 1 y el constructor 2? ¿O es simplemente una mejor práctica de codificación utilizar la palabra clave "Esto"?

Saludos

+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: Eso no es un Dup, es un Trip ... ¡un triplicado! : P – Cerebrus

Respuesta

22

Los constructores son los mismos. El motivo por el que preferiría el segundo es que le permitirá eliminar los guiones bajos de sus nombres de variables privados y conservar el contexto (lo que mejora la comprensibilidad). Practico usar siempre this cuando me refiero a variables y propiedades de instancia.

Ya no utilizo la palabra clave this de esta manera después de mudarme a una empresa diferente con estándares diferentes. Me he acostumbrado y ahora casi nunca lo uso cuando me refiero a los miembros de la instancia. Todavía recomiendo usar propiedades (obviamente).

Mi versión de su clase:

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"); 
    } 
} 

o, aún mejor, pero no es tan claro el uso de this de campos.

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

Así que, ¿está el código publicado una forma más antigua de hacer esto? ¿Y el código que publicó es la forma más actualizada de hacerlo? También ..... Como declaras solo las propiedades y no los campos, ¿cómo se establece el nivel de modificador para los campos? ¿o simplemente se establece automáticamente como privado? – Goober

+4

El último ejemplo usa propiedades automáticas introducidas en C# 3.0 (VS2008). Citando de la Guía de programación de C#: "En C# 3.0 y posteriores, las propiedades implementadas automáticamente hacen que la declaración de propiedad sea más concisa cuando no se requiere lógica adicional en los accesadores de propiedades. También permiten que el código de cliente cree objetos Cuando declara una propiedad como se muestra en el siguiente ejemplo, el compilador crea un campo de respaldo privado y anónimo al que solo se puede acceder a través de los accesadores get y set de la propiedad ". Ejemplo omitido. – tvanfosson

+0

Siento el uso de la palabra clave 'this' cuando es redundante y prolijo y solo hace que el código sea más difícil de leer. Debería ser obvio qué son campo y qué son locales. Si no, necesitas dividir las cosas para que tengas métodos más cortos. – vidstige

0

Usted puede usar esto para diferenciar entre una variable llamada local X y un campo de nivel de clase/propiedad del mismo nombre.

6

No hay diferencia en las dos declaraciones ...

//These are exactly the same. 

this._person 

//and 

_person 

La referencia a "este" se implica en el caso de _person. No diría que necesariamente es una práctica de codificación "mejor", diría que es solo preferencia.

+1

de acuerdo en el punto re: preferencia –

+0

Sí. No hay nada de malo con ninguna de las sintaxis. – BlackWasp

+1

Prefiero la sintaxis de subrayado porque es más corta y, como dijo Brian, el guión bajo implica "esto" de todos modos. La única ventaja que diría que hay para el usuario explícito de "esto", es que si alguna vez hay un problema de ambigüedad, "esto" lo resolverá. En esos casos, tiendo a usar "esto" para resolver el problema en cuestión como un caso especial. –

0

No debe utilizar las variables privadas _person y _parter. Ese es el propósito de sus captadores y establecedores.

En cuanto a las construcciones, no hay diferencia real entre ellas. Dicho esto, siempre prefiero usar la palabra clave This, ya que se presta para la legibilidad.

3

Dado que está utilizando guiones bajos, no hay conflicto entre los nombres; por lo que el "this." es redundante y se puede omitir. El IL no se verá afectado.

Mientras no exista ambigüedad entre un campo y variable/parareter, solo hay un escenario en el que la palabra clave this (en el contexto de significado la instancia actual - no ctor-encadenamiento) es estrictamente necesaria - invocando un método de extensión que se define por separado:

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

Ah, ya lo veo. Curioso de hecho. Pero comprensible, ya que los métodos de extensión siempre se invocan en conexión con un objeto explícito. Sin "esto" parecería que estás llamando a un método declarado en la clase actual. Aún así, el compilador debería ser capaz de resolver dicho método ... oh bien –

12

"this" también se utiliza en .Net 3.5 con los métodos de extensión:

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

se extendería la clase string

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

Para responder a su pregunta: no, no hay diferencia en sus dos constructores. Imo, el "esto" desordena el código y solo se debe usar cuando sea necesario, p. cuando los parámetros y las variables de campo tienen los mismos nombres.

También hay un caso cuando la clase implementa explícitamente una interfaz. Si necesita llamar a los métodos de interfaz desde dentro de su clase en la que tendría que jugar esta a la interfaz:

class Impl : IFace 
{ 

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

    void IFace.SomeMethod() 
    { 
    } 
} 
+0

Re "me lo ganaste"; de hecho, estamos mostrando 2 cosas diferentes. Estoy mostrando el uso de "esto" cuando ** se llama ** a un método de extensión, no al definir uno.Es una curiosidad que el "esto" sea necesario en tales casos. –

+0

+1 De acuerdo en que "esto" desordena el código y es redundante. – Vadim

1

Ambos constructores hacen lo mismo de todos modos en el segundo la this es redundante

Cuestiones relacionadas