2010-06-24 3 views
11

Je viens à travers un code MC++ comme ceci:Comment vérifier une "référence d'objet NULL" dans 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; 
} 

est-il pas important de vérifier si b est NULL avant que l'accès à sa valeur? J'ai essayé if(b == NULL), mais ça ne fonctionne pas.

Ou n'est-ce vraiment pas nécessaire de faire le contrôle? cependant je peux à peine le croire ...

PS: Je veux seulement savoir si la "référence" elle-même pourrait être nulle ici. Que le contenu de la classe B soit nul n'est pas important.

+1

Avez-vous essayé d'utiliser le mot-clé 'nullptr'? C'est un mot-clé C++/CLI, mais peut-être cela fonctionne aussi avec C++ managé. http://msdn.microsoft.com/en-us/library/4ex65770.aspx – dtb

+0

Null référence? Yuck. – DanDan

+0

@DanDan: il parle de références .NET, pas de celles en C++. – jalf

Répondre

19

Ce programme est à la fois syntaxiquement et sémantiquement correct, autant que je sache.

La référence pourrait être nulle là, en fonction de l'implémentation de GetClassB(). Donc, techniquement, il pourrait y avoir une référence nulle attendant d'y arriver.

Cependant, si le contenu de GetClassB() ressemble à ceci:

return gcnew ClassB(); 

vous garantie soit jeter une exception ou réussir, ce qui signifie que la référence ne serait jamais accidentellement nulle. Donc, la vraie réponse est: Cela dépend, mais vous n'êtes jamais requis pour vérifier null.

Pour vérifier l'utilisation null:

if (b == nullptr) 
{ 
} 
+0

Merci beaucoup pour votre réponse rapide :) La raison pour laquelle je veux vérifier NULL est que je n'ai pas écrit les deux classes. Ils sont inclus dans la bibliothèque .NET. Puisque je ne peux pas dire ce qui sera vraiment retourné en cas d'erreur, et que je ne veux pas lancer des exceptions "trop ​​fréquemment" au moment de l'exécution, je préférerais faire la vérification simple à ce stade. :) E. – Echo

+0

oui, ce que j'ai oublié est, les exceptions pourraient être levées par ClassB ici de toute façon, que je ne peux pas empêcher :) – Echo

Questions connexes