Обрабатывать объявления - PullRequest
1 голос
/ 10 июня 2011

Может кто-нибудь сказать мне, в чем разница между этими двумя строками кода, какую из них лучше использовать?

    System::String ^MyStr = gcnew System::String(MyStr); 

    System::String ^MyStr; 

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

Эти строки не эквивалентны.В первом случае вы получите исключение, потому что пытаетесь создать строку из неинициализированного дескриптора отслеживания (MyStr).Во втором случае MyStr объявлен, а не определен, он указывает на мусор и выдаст исключение, если вы попытаетесь его использовать.Какой из них использовать, зависит от остальной части кода

0 голосов
/ 11 июня 2011

Второй создает новую переменную дескриптора.Если это локальная переменная, то, как говорит @dario_ramos, она неинициализирована, и ваша программа, скорее всего, вылетит, если вы попытаетесь использовать дескриптор перед его назначением.Если это переменная-член или глобальная переменная, то она будет nullptr.

Первая аналогична, хотя ее можно использовать только для локальных или глобальных переменных (переменные-члены используют ctor-initializer *Синтаксис 1005 * в C ++ / CLI, как обычный C ++), и делает именно то, что вам запрещено делать.Он читает новый неинициализированный дескриптор и передает его конструктору System::String.Если случайно конструктор завершает работу, дескриптор вновь созданного String будет помещен в переменную как часть инициализации.Но поскольку конструктор пытается создать копию случайного мусора (если он локальный) или nullptr (если глобальный), скорее всего, он просто рухнет.

Использовать значение - плохая идеялюбой переменной в своем собственном инициализаторе (иногда вам нужно использовать адрес, а не значение).

...