2010-06-24 11 views
11

ho venire attraverso un codice MC++ in questo modo:Come verificare un "riferimento oggetto NULL" in 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; 
} 

Non è importante verificare se B è NULL prima di accedere al suo valore? Ho provato if(b == NULL), ma non funziona.

Oppure non è davvero necessario effettuare il controllo? tuttavia non riesco a crederci ...

PS: Voglio solo sapere se il "Riferimento" stesso potrebbe essere NULL qui. Se il contenuto della classe B è nullo non è importante.

+1

Hai provato a usare la parola 'nullptr'? È una parola chiave C++/CLI, ma forse funziona anche con Managed C++. http://msdn.microsoft.com/en-us/library/4ex65770.aspx – dtb

+0

Riferimento null? Che schifo. – DanDan

+0

@DanDan: parla di riferimenti .NET, non di C++. – jalf

risposta

19

Questo programma è sia sintatticamente che semanticamente corretto, per quanto ne so.

Il riferimento POTREBBE essere nullo lì, a seconda dell'implementazione di GetClassB(). Quindi, tecnicamente, potrebbe esserci un riferimento null in attesa di accadere lì.

Tuttavia, se il contenuto del GetClassB() aspetto:

return gcnew ClassB(); 

si sono garantiti per due un'eccezione o di successo, il che significa che il riferimento non sarebbe mai essere accidentalmente nullo.

Quindi, la vera risposta è: dipende, ma non sei mai richiesto per verificare null.

Per controllare per l'uso nullo:

if (b == nullptr) 
{ 
} 
+0

Grazie mille per la tua risposta veloce :) Il motivo per cui voglio controllare NULL è che non ho scritto entrambe le classi. Sono inclusi nella libreria .NET. Dal momento che non posso dire cosa verrà effettivamente restituito se si verifica un errore, e non vogliamo gettare eccezioni "troppo frequentemente" in fase di esecuzione, quindi preferirei fare un semplice controllo a questo punto. :) E. – Echo

+0

Sì, quello che ho dimenticato è, le eccezioni potrebbero essere lanciate da ClassB qui in ogni caso, che non posso impedire :) – Echo