1

これらの 2 行のコードの違いは何ですか。どちらを使用するのが良いですか?

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

    System::String ^MyStr; 
4

2 に答える 2

2

これらの行は同等ではありません。最初の例では、初期化されていない追跡ハンドル(MyStr)から文字列を作成しようとしているため、例外が発生します。2番目の例では、MyStrが宣言されており、定義されていません。これはガベージを指し、使用しようとすると例外をスローします。どちらを使用するかは、残りのコードによって異なります

于 2011-06-10T17:06:27.737 に答える
0

2つ目は、新しいハンドル変数を作成します。ローカル変数の場合、@ dario_ramosが言うように、初期化されていないため、割り当てる前にハンドルを使用しようとすると、プログラムがクラッシュする可能性があります。メンバー変数またはグローバルの場合は、になりますnullptr

最初のものは似ていますが、ローカルまたはグローバルにのみ使用でき(メンバー変数は、プレーンC++と同じようにC++ / CLIのctor-initializer構文を使用します)、許可されていないことを正確に実行します。初期化されていない新しいハンドルを読み取り、System::Stringコンストラクターに渡します。コンストラクターが偶然に終了した場合String、初期化の一部として、新しく構築されたハンドルが変数に配置されます。ただし、コンストラクターはランダムなガベージ(ローカルの場合)または(グローバルの場合)のコピーを作成しようとしているためnullptr、ほとんどの場合、単にクラッシュします。

独自の初期化子で変数の値を使用することはお勧めできません(値ではなくアドレスを使用する必要がある場合があります)。

于 2011-06-11T13:11:27.033 に答える