2010-06-24 18 views
11

me encuentro con algún código MC++ así:¿Cómo verificar una "referencia de objeto NULL" en Managed C++?

__gc class ClassA 
{ 
Puclic: 
    ClassB GetClassB(); 
} 

__gc class ClassB 
{ 
Public: 
    int Value; 
} 

int main() 
{ 
    ClassA^ a = gcnew ClassA(); 
    ClassB^ b = a->GetClassB(); 

    int c = b->Value; 
} 

No es importante comprobar si b es NULL antes de acceder a su valor? Intenté if(b == NULL), pero no funcionó.

¿O realmente no es necesario hacer el cheque? sin embargo, apenas puedo creerlo ...

PD: Solo quiero saber si la "Referencia" en sí podría ser NULA aquí. Si el contenido de la clase B es nulo no es importante.

+1

¿Ha intentado utilizar la palabra clave 'nullptr'? Es una palabra clave C++/CLI, pero tal vez también funciona con Managed C++. http://msdn.microsoft.com/en-us/library/4ex65770.aspx – dtb

+0

¿Referencia nula? Yuck. – DanDan

+0

@DanDan: está hablando de referencias .NET, no de C++. – jalf

Respuesta

19

Este programa es tanto sintáctica como semánticamente correcto, por lo que yo sé.

La referencia PODRÍA ser nula allí, según la implementación de GetClassB(). Entonces, técnicamente, podría haber una referencia nula esperando que ocurriera allí.

Sin embargo, si el contenido de GetClassB() se ve así:

return gcnew ClassB(); 

se le garantiza a cualquiera lanzar una excepción o tener éxito, lo que significa que la referencia nunca accidentalmente ser nulo.

Entonces, la verdadera respuesta es: Depende, pero usted nunca es requerido para verificar nulo.

Para comprobar si el uso nulo:

if (b == nullptr) 
{ 
} 
+0

Muchas gracias por su respuesta rápida :) La razón por la que quiero verificar NULL es porque no escribí ambas clases. Están incluidos en la biblioteca .NET. Como no puedo decir qué será realmente devuelto si ocurre un error, y no quiero lanzar excepciones "con demasiada frecuencia" en el tiempo de ejecución, así que preferiría hacer la verificación simple en este punto. :) E. – Echo

+0

sí, lo que olvidé es que las excepciones podrían ser lanzadas por ClassB aquí de todos modos, lo que no puedo evitar :) – Echo

Cuestiones relacionadas