2009-06-12 10 views
170

¿Puedo llamar a un constructor sobrecargado de otro constructor de la misma clase en C#?¿Puedo llamar a un constructor sobrecargado de otro constructor de la misma clase en C#?

+0

qué idioma? ... –

+0

@Malay: ¿De qué idioma estás hablando? Si estás hablando de java/C#, ¿por qué debería ser esta una pregunta? La documentación debería ayudarlo antes de publicar una pregunta. Lo siento, si estoy equivocado en mi comprensión. – shahkalpesh

+0

C# .. me puede llamar segundo constructor como esto foo (args) de base() pero ¿es posible hacer como esto foo() { // hacer algo foo (args) // hacer algo } –

Respuesta

32

EDITAR: Según los comentarios en la publicación original, esta es una pregunta de C#.

Respuesta corta: sí, usando la palabra clave this.

Respuesta larga: sí, usando la palabra clave this, y aquí hay un ejemplo.

class MyClass 
{ 
    private object someData; 

    public MyClass(object data) 
    { 
     this.someData = data; 
    } 

    public MyClass() : this(new object()) 
    { 
     // Calls the previous constructor with a new object, 
     // setting someData to that object 
    } 
} 
+1

la cuestión no era de esto, la pregunta está preguntando si usted puede hacer esto MiClase pública() { // // hacer algo continuación vamos a llamar a otro constructor esto (nuevo objeto()); /// ¡No puedes hacer esto! } – mfawzymkh

+0

gracias mfaawymkh ... así que no puedo hacer eso. –

+0

Ah, ja, lo entiendo ahora. Sí, no se puede hacer. –

207

No, usted no puede hacer eso, el único lugar donde puede llamar al constructor de otro constructor en C# es inmediatamente después de ":" después del constructor. por ejemplo

class foo 
{ 
    public foo(){} 
    public foo(string s) { } 
    public foo (string s1, string s2) : this(s1) {....} 

} 
4

En C# no es posible llamar a otro constructor desde el interior del cuerpo del método. Puede llamar a un constructor base de esta manera: foo (args): base() como se señaló usted mismo. También puede llamar a otro constructor en la misma clase: foo (args): this().

Cuando quiera hacer algo antes de llamar a un constructor base, parece que la construcción de la base es de clase y depende de algunas cosas externas. Si es así, debe hacerlo a través de argumentos del constructor base, no estableciendo propiedades de la clase base o algo así

71

Si quiere decir si puede hacer ctor encadenamiento en C#, la respuesta es sí. The question ya se ha pedido.

Sin embargo, parece a partir de los comentarios, parece lo que realmente tiene la intención de preguntar es '¿Puedo llamar a un constructor sobrecargado de dentro otro constructor con el procesamiento de pre/post?
Aunque C# no tiene la sintaxis para hacer esto, usted puede hacer esto con una función de inicialización común (igual que lo haría en C++ que no soporta el encadenamiento de Héctor)

class A 
{ 
    //ctor chaining 
    public A():this(0) 
    { Console.WriteLine("default ctor"); } 

    public A(int i) 
    { Init(i); } 

    // what you want 
    public A(string s) 
    { 
    Console.WriteLine("string ctor overload"); 
    Console.WriteLine("pre-processing"); 
    Init(Int32.Parse(s)); 
    Console.WriteLine("post-processing"); 
    } 

    private void Init(int i) 
    { 
    Console.WriteLine("int ctor {0}", i); 
    } 
} 
+0

Probablemente esta sea la respuesta aceptada. – Panzercrisis

Cuestiones relacionadas