tipos - que es una instancia en c#
: esta sintaxis(foo) en constructores C#? (7)
De vez en cuando, me encuentro con la sintaxis que he visto antes, pero que nunca he usado. Éste es uno de esos momentos.
¿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 intuición es que se usa para mapear un argumento predeterminado en otro método constructor.
Básicamente 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.
Cada constructor en una clase .NET asegura que también se llame a un constructor en la clase de la que hereda.
Entonces, si tienes las siguientes clases:
public class Base { }
public class Something : Base { }
public class Else : Something { }
luego un constructor en Else llamará a un constructor en Something, que también llamará a un constructor en 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 en 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.
Es así si no me equivoco:
public MyClass(SomeArg arg) : this(new SomethingElse(), arg)
llamará
public MyClass(SomethingElse arg, SomeArg arg1) : base or this or nothing
y eso continuará hasta que tengas una base o nada.
Si tiene una base(....)
entonces el constructor que tiene eso llamará al constructor base con los parámetros (si los hay) dados, que a su vez pueden delegar a sus propios constructores (el mismo juego).
Si no tiene nada, entonces el constructor sin parámetros de la clase base se llama automáticamente.
Después de haber utilizado this(....)
, se usará el constructor que coincida con los parámetros y se ejecutará su cuerpo, además del cuerpo del constructor que lo haya utilizado this(....)
.
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.
Sí, tiene usted 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 al predeterminado. 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 miembro redundante.
en Pro C # 2005 y .NET 2.0 Platform, 3ra Edición de Andrew Troelsen
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.
Tu instinto es correcto. La sintaxis se usa para llamar a los 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");
}
Emite lo siguiente
Called from default constructor Called from main function
Del mismo modo : base(someParams)
se usa para llamar a los constructores base.