2010-06-24 1 views
11

я сталкиваюсь некоторый код MC++ как это:Как проверить ссылку на NULL-объект в управляемом 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; 
} 

Это не важно, чтобы проверить, является ли NULL б получения доступа к его значению? Я пробовал if(b == NULL), но он не работает.

Или действительно нет необходимости делать чек? однако я вряд ли могу в это поверить ...

PS: Я только хочу знать, может ли здесь «Ссылка» быть NULL. Является ли содержание класса B нулевым, не имеет значения.

+1

Вы пробовали с помощью 'nullptr' ключевого слова? Это ключевое слово C++/CLI, но, возможно, оно работает и с Managed C++. http://msdn.microsoft.com/en-us/library/4ex65770.aspx – dtb

+0

Ссылка на нуль? Тьфу. – DanDan

+0

@DanDan: он говорит о .NET-ссылках, а не о C++. – jalf

ответ

19

Эта программа является синтаксически и семантически корректной, насколько я могу судить.

Ссылка МОЖЕТ быть нулевой там, в зависимости от реализации GetClassB(). Итак, технически, там может быть нулевая ссылка, ожидающая там.

Однако, если содержимое GetClassB() выглядит следующим образом:

return gcnew ClassB(); 

вы гарантированно либо выбросить исключение или успех, а это означает, что ссылка никогда бы не случайно быть пустым.

Итак, настоящий ответ: это зависит, но вам никогда не нужно , чтобы проверить наличие null.

Для проверки использования нуля:

if (b == nullptr) 
{ 
} 
+0

Большое спасибо за ваш быстрый ответ :) Причина, по которой я хочу проверить NULL, заключается в том, что я не писал оба класса. Они включены в библиотеку .NET. Поскольку я не могу сказать, что действительно будет возвращено, если произойдет ошибка, и вы не хотите слишком часто «исключать» исключения во время выполнения, поэтому я бы скорее сделал простую проверку на этом этапе. :) E. – Echo

+0

да, что я забыл, исключения могут быть брошены ClassB здесь, в любом случае, что я не могу предотвратить :) – Echo