2010-02-19 3 views
5

Ejemplo¿Cómo hago las operaciones en un constructor base heredado en C#?

public class ClassA 
{ 
    public ClassA(string someString){} 
} 

public class ClassB : ClassA 
{ 
    public ClassB(string someString):base(someString.ToLower()){} 
} 

I llama al constructor ClassB heredado. Paso en un nulo. ToLower() arroja una excepción sobre un nulo. Quiero comprobar si hay un nulo antes de que eso suceda. ¿Cómo puedo hacer esto?

+0

¿Y qué quieres hacer si la cadena es nula? – Andrew

+0

Más que probable pasar el nulo a ClassA. Otras opciones incluyen pasar una cadena String.Empty o alguna cadena "predeterminada". – danmine

+0

@danmine: eso es bastante fácil de superar; elige la respuesta aceptada y devuelve a los demás; es solo una 5 diferencia de reputación. –

Respuesta

7

simple. Usando null-coalescing operator:

public ClassB(string someString) : 
    base((someString ?? "").ToLower()) 
{ 
} 

O usando ternary operator

public ClassB(string someString) : 
    base(someString == null ? "" : someString.ToLower()) 
{ 
} 

Mejor aún, me gustaría sugerir que añadir un Constuctor sin argumentos a ClassB, la cual llamará base(string.Empty).

+1

Siempre me olvido de esto ?? operador, gracias por recordarme :) –

+0

¡Guau, aquí estaba tratando de hacer algo muy difícil! Ni siquiera sabía sobre el ?? – danmine

6

Prueba esto:

base(someString == null ? string.Empty : someString.ToLower()) 
3

probar este

public class ClassA 
{ 
    public ClassA(string someString) { } 
} 

public class ClassB : ClassA 
{ 
    public ClassB(string someString) : base(someString == null ? "" : someString.ToLower()) { } 
} 
1

Debe comprobar si someString es nulo en su clase base y actuar en consecuencia, de lo contrario puede hacer algo como esto, pero creo que es muy ilegible.

public class ClassB : ClassA 
{ 
    public ClassB(string someString):base((String.IsNullOrEmpty(someString)) ? String.Empty : someString.ToLower()){} 
} 
2

Usted ya ha conseguido respuestas en su pregunta, pero sólo quiero añadir que el enfoque me parece un poco extraño. ¿Es realmente la responsabilidad del que llama asegurarse de que la entrada esté en minúsculas? Definitivamente, me gustaría hacer esta comprobación y la conversión en el constructor de la clase base en lugar:

class Base 
{ 
    private string _someString; 
    public Base(string someString) 
    { 
     _someString = someString != null ? someString.ToLower() : null; 
    } 
} 

class Derived : Base 
{ 
    public Derived(string someString) : base(someString) { } 
} 

De esta manera la clase base no depende de la forma en que la clase derivada elige pasar el argumento.

Cuestiones relacionadas