これらの 2 行のコードの違いは何ですか。どちらを使用するのが良いですか?
System::String ^MyStr = gcnew System::String(MyStr);
System::String ^MyStr;
これらの行は同等ではありません。最初の例では、初期化されていない追跡ハンドル(MyStr)から文字列を作成しようとしているため、例外が発生します。2番目の例では、MyStrが宣言されており、定義されていません。これはガベージを指し、使用しようとすると例外をスローします。どちらを使用するかは、残りのコードによって異なります
2つ目は、新しいハンドル変数を作成します。ローカル変数の場合、@ dario_ramosが言うように、初期化されていないため、割り当てる前にハンドルを使用しようとすると、プログラムがクラッシュする可能性があります。メンバー変数またはグローバルの場合は、になりますnullptr
。
最初のものは似ていますが、ローカルまたはグローバルにのみ使用でき(メンバー変数は、プレーンC++と同じようにC++ / CLIのctor-initializer構文を使用します)、許可されていないことを正確に実行します。初期化されていない新しいハンドルを読み取り、System::String
コンストラクターに渡します。コンストラクターが偶然に終了した場合String
、初期化の一部として、新しく構築されたハンドルが変数に配置されます。ただし、コンストラクターはランダムなガベージ(ローカルの場合)または(グローバルの場合)のコピーを作成しようとしているためnullptr
、ほとんどの場合、単にクラッシュします。
独自の初期化子で変数の値を使用することはお勧めできません(値ではなくアドレスを使用する必要がある場合があります)。