メソッド自体からメソッドに渡された値を変更する必要がある場合があります。例は、このメソッドのような文字列をここでサニタイズすることです:
void SanitizeName(string Name)
{
Name = Name.ToUpper();
//now do something here with name
}
Name
引数は参照によって渡されないため、これは純粋に無害です。ただし、何らかの理由で、将来の開発者がすべての値をrefで渡すことを決定した場合、文字列のサニタイズはメソッドの外部の値に影響を及ぼし、有害な結果になる可能性があります。
したがって、引数自体に再度割り当てるのではなく、常に次のようにローカルコピーを作成します。
void SanitizeName(string Name)
{
var SanitizedName = Name.ToUpper();
//now do something here with name
}
これは、値が渡される方法を変更しても、メソッドの外側での動作に影響を与えないことを保証しますが、これについて過度に偏執的ではないかと思います。
それはあなたのプロジェクトのコーディング規約に依存すると思います。
私は個人的に、Eclipseにすべての変数とパラメーターにfinal
キーワードを自動的に追加させています。これにより、パラメーターが再利用されているかどうかが一目でわかります。
私の仕事でのプロジェクトでは、パラメーターを再利用することはお勧めしませんが、たとえば、 .trim()
またはnull
の場合にデフォルトを設定すると、ほとんどの場合、パラメーターが再利用されます。そのような場合、新しい変数の導入は、パラメーターの再利用よりも読みにくいためです。
名前がコンテンツを参照しなくなるため、非常に異なるコンテンツを格納するためにパラメーターを再利用しないでください。しかし、これは変数のすべての再割り当てに当てはまり、パラメーターに限定されません。
チームと集まり、この問題をカバーするコーディング規約を策定してください。
セキュリティの目的で静的コードアナライザーを使用すると、混乱して、使用前に入力パラメーター変数を検証またはサニタイズしていないと思われる場合があります。たとえば、SQLクエリでName
を使用すると、SQLインジェクションの脆弱性を主張し、説明に時間がかかる可能性があります。それは悪いです。一方、実際に入力をサニタイズせずに、サニタイズされた入力に明確に名前が付けられた変数を使用することは、ナイーブコードアナライザー(偽陰性の脆弱性の発見)を迅速に静める方法です。
これに対する答えは、あなたのコードを誰が読むかによって100%異なります。彼らはどのスタイルが最も役立つと思いますか?
最も一般的なケースは、関数の引数に値を再割り当てしないことです。あまりにも多くの開発者が、関数呼び出しの動作のメンタルモデルを持っているため、これを行うことはないと想定しています。この問題は、各関数を呼び出すときに使用する引数の値を出力するデバッガーによって悪化する可能性があります。この情報は技術的に引数を編集する場合は正しくありません。これにより、不思議な不満が生じる可能性があります。
そうは言っても、メンタルモデルは変化します。特定の開発環境では、name
を「現時点での名前の最も適切な表現」にすることが望ましい場合があります。途中で値にいくつかの変更を加えた場合でも、作業中の変数を引数に明示的にリンクすることが望ましい場合があります。かさばるオブジェクトを作成するのではなく、特定の変数を再利用することには、実行時の大きな利点があります。結局のところ、4GBの文字列で作業しているときは、作成する必要がある余分なコピーの数を最小限に抑えるのが良いです。