C#では、宣言された変数を宣言して初期化するのではなく、以前に宣言した変数を再初期化する利点または欠点がありますか?変数を再初期化するか、新規に宣言しますか?
string str;
for (int i = 0; i < 100; i++)
{
str = "This is string #" + i.ToString(); // Re-initialize the "str" variable.
Console.WriteLine(str);
}
:
DataColumn col1 = new DataColumn();
col1.ColumnName = "Subsite";
gridDataTable.Columns.Add(col1);
DataColumn col2 = new DataColumn(); // Declare a new variable instead.
col2.ColumnName = "Library";
gridDataTable.Columns.Add(col2);
ループを伴う同様の例VS
DataColumn col = new DataColumn();
col.ColumnName = "Subsite";
dataTable.Columns.Add(col);
col = new DataColumn(); // Re-use the "col" declaration.
col.ColumnName = "Library";
dataTable.Columns.Add(col);
たとえば
(簡潔およびヒト可読性に思考を無視して)、これらの二つのサンプルを比較します対
for (int i = 0; i < 100; i++)
{
string str = "This is string #" + i.ToString(); // Declare a new "str" each iteration.
Console.WriteLine(str);
}
編集:これまでの回答はありがとうございます。それらを読んだ後、私は少し私の質問に拡大すると思った:
私が間違っている場合は私を修正してください。
System.Stringのような参照型を宣言して初期化すると、スタックに存在するそのオブジェクトへのポインタと、ヒープ上に存在するオブジェクトの内容(ポインタでのみアクセス可能)があります。
最初のループの例では、1つのポインタstrを作成して、ヒープ上に存在するStringクラスの100個のインスタンスを作成するようです。私の考えでは、ループを繰り返しながら、 "str"ポインタを変更してStringクラスの新しいインスタンスを指すようにするだけです。それらへのポインタをもはや持っていないそれらの "古い"文字列はガベージコレクションされます - 私はそれがいつ発生するかわかりませんが。
2番目のループの例では、Stringクラスの100個のインスタンスを作成するだけでなく、100個のポインタを作成するようです。
私は、もはや必要ではなくなったスタック上のアイテムに何が起こるのか分かりません。私はガベージコレクターがこれらのアイテムも取り除いたとは思わなかった。おそらく、スコープを終了するとすぐにスタックから削除されますか?たとえそれが本当であっても、ポインタが1つしか作成されず、それが指し示すものを更新する方が、100の異なるポインタを作成するより効率的で、それぞれが一意のインスタンスを指していると思います。
"早すぎる最適化は悪い"という議論があると私は理解していますが、私はプログラムの最適化ではなく、より深い理解を得ようとしています。
"人間の読みやすさに対する考えを無視する" - 第2の最も重要な要素(最初の "正しさ")を無視することは、おそらく決定を下す悪い方法です。 –
@エリック:「このようにする、読みやすくする」のような回答を断るためにのみ、その文章を追加しました。もちろん、私はコード読み取り可能なパラマウントを作ることを検討します。私は、パフォーマンスの違いがあるかのように、より技術的な答えを探していました。 –