6

ここで議論を解決するのを手伝ってください。

これは:

SqlCommand cmd = new SqlCommand( "sql cmd", conn);

これとまったく同じように扱われます:

const string s = "sql cmd";
SqlCommand cmd = new SqlCommand( s, conn);

すなわち。文字列 s が const であることを具体的に述べれば、違いはありますか。

そして、もしそれが同じように扱われなければ、なぜですか?

4

6 に答える 6

7

後者のスニペットでは、文字列が const であるのではなく、変数が const であるということです。これは、C++ の const とまったく同じではありません。(文字列は .NET では常に不変です。)

はい、2 つのスニペットは同じことを行います。唯一の違いは、最初のフォームにもメタデータ エントリがsあり、変数が (ローカル変数ではなく) 型レベルで宣言されている場合、他のメソッドもそれを使用できることです。もちろん、他の場所で「sql cmd」を使用する場合、文字列のインターンにより、メモリ内には単一の文字列オブジェクトしかありません...しかし、リフレクションを使用して型を見ると、const がフィールドとして見つかります。メタデータが定数フィールドとして宣言されている場合は 2 番目のスニペットを含み、それが単なるローカル変数である場合は、作成すると PDB ファイルに含まれます。

于 2009-02-10T11:47:46.330 に答える
2

a の値はconst常に呼び出し元に直接焼き付けられるため、同じです。

さらに、コンパイラはソース コードで見つかった文字列をインターンしconstます。これは、同じ文字列を複数回使用している場合に役立ちます (純粋にメンテナンスの観点から - どちらの方法でも結果は同じです)。

于 2009-02-10T11:49:10.790 に答える
1

はい、 Reflectorを使用してアセンブリを確認してください。const 文字列はコンパイル時にリテラル文字列に置き換えられます。Reflector を使用する作業を安全にするために、これに関するブログ投稿もあります :)

于 2009-02-10T12:01:10.403 に答える
1

SqlCommand のコンストラクターは違いを「認識」しないため、同じように動作します。

于 2009-02-10T11:47:06.973 に答える
1

はい、それらはまったく同じです。

于 2009-02-10T11:47:43.990 に答える
0

これについて 100% 確信があるわけではありませんが、きっと同じだと思います。

const は、変数を再設定しないようにするだけですが、コンパイル時に実行できるものです。

さらに、文字列は不変なので、変数を宣言するかどうかに違いはないと思います。

ただし、明確な証明は、両方のケースで生成された IL コードを調べることです。

于 2009-02-10T11:49:03.210 に答える