2010-06-24 14 views
11

stoße ich auf einige MC++ Code wie folgt:Wie überprüft man eine "NULL Objektreferenz" 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; 
} 

Ist es nicht wichtig zu überprüfen, ob b, bevor der Zugriff auf seinen Wert NULL ist? Ich habe versucht if(b == NULL), aber es funktioniert nicht.

Oder ist es wirklich nicht notwendig, den Scheck zu machen? aber ich kann es kaum glauben ...

PS: Ich möchte nur wissen, ob die "Referenz" selbst hier NULL sein könnte. Ob der Inhalt der Klasse B null ist, ist nicht wichtig.

+1

Haben Sie versucht, die 'nullptr' Schlüsselwort? Es ist ein C++/CLI-Schlüsselwort, aber vielleicht funktioniert es auch mit Managed C++. http://msdn.microsoft.com/en-us/library/4ex65770.aspx – dtb

+0

Null Referenz? Jawohl. – DanDan

+0

@DanDan: Er spricht über .NET-Referenzen, nicht C++ -. – jalf

Antwort

19

Dieses Programm ist sowohl syntaktisch als auch semantisch korrekt, soweit ich das beurteilen kann.

Die Referenz COULD ist dort null, abhängig von der Implementierung GetClassB(). Also, technisch könnte dort eine Null-Referenz warten, um dort zu passieren.

Wenn jedoch der Inhalt von GetClassB() wie folgt aussieht:

return gcnew ClassB(); 

Sie sind garantiert entweder eine Ausnahme auslösen oder erfolgreich zu sein, was bedeutet, dass die Referenz würde versehentlich niemals null sein.

Also, die echte Antwort ist: Es kommt darauf an, aber Sie sind nie erforderlich auf Null zu überprüfen.

Um null Verwendung zu überprüfen:

if (b == nullptr) 
{ 
} 
+0

Vielen Dank für Ihre schnelle Antwort :) Der Grund, warum ich NULL überprüfen möchte, ist, dass ich nicht beide Klassen geschrieben habe. Sie sind in der .NET-Bibliothek enthalten. Da ich nicht sagen kann, was wirklich zurückgegeben wird, wenn ein Fehler auftritt, und keine Ausnahmen "zu häufig" zur Laufzeit abwerfen möchte, möchte ich an dieser Stelle lieber die einfache Überprüfung durchführen. :) E. – Echo

+0

ja, was ich vergaß ist, die Ausnahmen könnten hier von ClassB sowieso geworfen werden, was ich nicht verhindern kann :) – Echo