2012-08-22 15 views
5

Consulte la pregunta incrustada en el comentario a continuación.Al encadenar un constructor base, ¿cómo puedo reutilizar el código de inicialización en una sobrecarga?

public class CustomException : Exception 
{ 
    private readonly string _customField; 

    public CustomException(string customField, string message) 
     : base(message) 
    { 
     // What's the best way to reuse the customField initialization code in the 
     // overloaded constructor? Something like this(customField) 
    } 

    public CustomException(string customField) 
    { 
     _customField = customField; 
    } 
} 

Estoy abierto a considerar implementaciones alternativas que reutilicen el constructor base y minimicen el código de inicialización. Me gustaría mantener el _customField de solo lectura, lo cual no es posible si extraigo un método de inicialización por separado.

Respuesta

3

Dividirlo en un método separado, y llamar a ese método desde ambos constructores.

public class CustomException : Exception 
{ 
    private readonly string _customField; 

    public CustomException(string customField, string message) 
     : base(message) 
    { 
     Init(out _customField, customField); 
    } 

    public CustomException(string customField) 
     : base() 
    { 
     Init(out _customField, customField); 
    } 

    private Init(out string _customField, string customField) 
    { 
     _customField = customField; 
    } 
} 
+0

Error de compilación: no se puede asignar un campo de solo lectura (excepto en un constructor o un inicializador de variable). Como mencioné en mi pregunta, me gustaría mantener el campo de solo lectura. –

+0

@ZaidMasud No, no hay error de compilación. En 'Init',' _customField' es un parámetro 'out' que hace referencia al campo, pero no al campo en sí. – hvd

+0

Ahh ... ver la edición ahora. Interesante sintaxis para ver el parámetro como un out y no un out también. Necesito probar esto. –

7
public CustomException(string customField) : this(customField,"") 
{ 
} 
+2

Gracias, pero esto es suponiendo que la clase base usa la cadena vacía como valor predeterminado. Esto puede ser lo suficientemente cercano para la clase Exception, pero no se garantiza que sea cierto en general. Para el constructor Public CustomException (string customField), idealmente, no se debería hacer ninguna llamada al constructor base. –

Cuestiones relacionadas