2008-12-03 19 views
15

De vez en cuando, me encuentro con la sintaxis que he visto antes, pero que nunca he usado. Éste es uno de esos momentos.: esta sintaxis (foo) en constructores C#?

¿Alguien puede explicar el propósito de ": this" o ": base" siguiendo un método constructor de C#?

Por ejemplo:

public MyClass(SomeArg arg) : this(new SomethingElse(), arg) 
{ 
} 

Mi primera impresión es que se utiliza para asignar un argumento predeterminado a otro método constructor.

Respuesta

17

Tienes razón. this() llama a un constructor en la instancia actual, base() llama al constructor del supertipo en la instancia actual. En general, se utilizan para manejar sobrecargas de constructores, por lo que puede agregar opciones adicionales sin dividir las cosas en un método separado.

4

Tienes razón.

: base (...) llama a un constructor de la clase base.

: esto (...) llama a otro constructor de la clase de definición. La mayoría de las veces funciona simplemente como una fachada.

3

Cada constructor en una clase .NET asegura que también se llame a un constructor en la clase de la que hereda.

Así que si usted tiene las siguientes clases:

public class Base { } 
public class Something : Base { } 
public class Else : Something { } 

continuación, un constructor de Else, llamarán a un constructor en algo, que también se llama un constructor de la base.

El constructor llamado en una clase base (es decir, la que está descendiendo) es siempre el constructor sin parámetros.

Si no tiene uno, o desea anularlo, puede anularlo, especificando la base (algunos parámetros aquí). Esto seleccionará el constructor correcto en la clase base.

También puede pedirle a un constructor que llame primero a otro constructor de la misma clase, en el mismo nivel. Esto se puede usar para evitar la duplicación del código de constructor en múltiples constructores. Sin embargo, en última instancia, los constructores a los que se llama llamará a un constructor en la clase base.

Espero que esto sea comprensible.

19

Tu instinto es correcto. La sintaxis se utiliza para llamar constructores sobrecargados en la misma clase:

public class Test 
{ 
    public Test() : this("Called from default constructor") { } 
    public Test(String msg) 
    { 
     Console.WriteLine(msg); 
    } 
} 

el siguiente código:

public static void Main(String[] args) 
{ 
    Test t1 = new Test(); 
    Test t2 = new Test("Called from Main function"); 
} 

salidas la siguiente

Called from default constructor 
Called from main function

mismo modo, : base(someParams) se utiliza para llamar constructores de base .

2

Exactamente. La llamamos Constructor Chaining y se usa para evitar el hecho de que C# no tiene la capacidad de hacer argumentos predeterminados.

Esto se usa mucho en IoC.

2

Es como esto si no me equivoco:

public MyClass(SomeArg arg) : this(new SomethingElse(), arg) 

llamarán

public MyClass(SomethingElse arg, SomeArg arg1) : base or this or nothing 

y que continuará hasta que tienes una base o nada.

Si tiene base(....), entonces ese constructor que tiene eso llamará al constructor base con los parámetros (si los hay) dados, que a su vez pueden delegar en sus propios constructores (mismo juego).

Si no tiene nada, se llama automáticamente al constructor sin parámetros de la clase base.

Después de haber utilizado , se usará el constructor que coincida con los parámetros y se ejecutará su cuerpo, adicionalmente al cuerpo del constructor que usó this(....).

2

Sí, tienes razón. Esta sintaxis se utiliza para tener sus constructores de subclase para llamar explícitamente a un constructor de clase base personalizado apropiado, en lugar de a los valores predeterminados. La palabra clave this en su pregunta se explica:

Otro uso de la palabra clave this es forzar a un constructor a llamar a otro para evitar la lógica de inicialización de miembros redundantes.

en Pro C# 2005 y .NET 2.0 Platform, 3ª edición por Andrew Troelsen

Cuestiones relacionadas