2010-06-24 15 views
11

spotykam jakiegoś MC++ kod tak:Jak sprawdzić "odwołanie do obiektu NULL" w 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; 
} 

nie jest to ważne, aby sprawdzić, czy b jest NULL przed dostępem do jego wartości? Próbowałem if(b == NULL), ale to nie działa.

Czy naprawdę nie trzeba wykonywać czeku? jednak nie mogę w to uwierzyć ...

PS: Chcę tylko wiedzieć, czy "Referencja" sama w sobie może być NULL tutaj. To, czy zawartość klasy B jest zerowa, nie jest ważne.

+1

Czy próbowali za pomocą słowa kluczowego 'nullptr'? Jest to słowo kluczowe C++/CLI, ale może działa również z Managed C++. http://msdn.microsoft.com/en-us/library/4ex65770.aspx – dtb

+0

Brak referencji? Fuj. – DanDan

+0

@DanDan: on mówi o referencjach .NET, a nie C++. – jalf

Odpowiedz

19

Ten program jest poprawny pod względem składni i semantyczności, o ile wiem.

Numer referencyjny może być tam zerowy, w zależności od implementacji GetClassB(). Technicznie rzecz biorąc, może się tam wydarzyć zerowy punkt odniesienia.

Jednakże, jeśli zawartość GetClassB() wygląda następująco:

return gcnew ClassB(); 

masz gwarancję albo wyjątek lub uda, co oznacza, że ​​odwołanie nigdy nie przypadkowo być null.

Tak, prawdziwa odpowiedź brzmi: To zależy, ale nigdy nie musisz wymagane, aby sprawdzić zerowy.

Aby sprawdzić do stosowania zerowej:

if (b == nullptr) 
{ 
} 
+0

Dziękuję bardzo za szybką odpowiedź :) Powodem, dla którego chcę sprawdzić NULL jest to, że nie napisałem obu klas. Są one zawarte w bibliotece .NET. Ponieważ nie mogę stwierdzić, co tak naprawdę zostanie zwrócone, jeśli wystąpi błąd, i nie chcę rzucać wyjątkami "zbyt często" w czasie wykonywania, więc wolałbym zrobić proste sprawdzenie w tym momencie. :) E. – Echo

+0

Tak, zapomniałem, że wyjątki mogą być wyrzucone przez ClassB tutaj i tak nie mogę zapobiec :) – Echo

Powiązane problemy