2009-05-06 22 views

Respuesta

192

Anexar :this(required params) al final del constructor para hacer 'encadenamiento constructor'

public Test(bool a, int b, string c) 
    : this(a, b) 
{ 
    this.m_C = c; 
} 
public Test(bool a, int b, float d) 
    : this(a, b) 
{ 
    this.m_D = d; 
} 
private Test(bool a, int b) 
{ 
    this.m_A = a; 
    this.m_B = b; 
} 

Fuente Cortesía de csharp411.com

+0

Eso fue muy fácil ... ¡gracias! –

27

Sí, tendrá que utilizar la siguiente

public class Lens 
{ 
    public Lens(string parameter1) 
    { 
     //blabla 
    } 

    public Lens(string parameter1, string parameter2) : this(parameter1) 
    { 

    } 
} 
+0

Creo que lo que sucedería en el segundo constructor es que crearías una instancia local de Lens que sale del alcance al final del constructor y NO está asignada a "esto". Debes usar la sintaxis de encadenamiento del constructor en la publicación de Gishu para lograr lo que pregunta. –

+0

Sí, lo siento. Corregido ahora. –

9

El orden de evaluación del constructor también debe tenerse en cuenta al encadenar constructores:

Para tomar prestado de la respuesta de Gishu, un poco (para mantener el código algo similar):

public Test(bool a, int b, string c) 
    : this(a, b) 
{ 
    this.C = c; 
} 

private Test(bool a, int b) 
{ 
    this.A = a; 
    this.B = b; 
} 

Si cambiamos el evalution realizado en el private constructor, un poco, vamos a ver por qué ordenamiento constructor es importante:

private Test(bool a, int b) 
{ 
    // ... remember that this is called by the public constructor 
    // with `this(...` 

    if (hasValue(this.C)) 
    { 
     // ... 
    } 

    this.A = a; 
    this.B = b; 
} 

Arriba, he agregado una llamada a función falsa que determina si la propiedad C tiene un valor. A primera vista, podría parecer que C tendría un valor: está establecido en el constructor que llama; Sin embargo, es importante recordar que los constructores son funciones.

this(a, b) se llama - y debe "devolver" - antes de que se realice el cuerpo del constructor public. Dicho de otra manera, el último constructor llamado es el primer constructor evaluado. En este caso, private se evalúa antes de public (solo para usar la visibilidad como el identificador).

Cuestiones relacionadas