2011-02-02 3 views
5

基本的には、最初の実行時に変数に値を格納するか、値を継続的に使用する方が良いでしょうか?値を複数回読み取るか、最初に変数として保存しますか?

TextWriter tw = null; 
if (!File.Exists(ConfigurationManager.AppSettings["LoggingFile"])) 
{ 
    // ... 
    tw = File.CreateText(ConfigurationManager.AppSettings["LoggingFile"]); 
} 

または

TextWriter tw = null; 
string logFile = ConfigurationManager.AppSettings["LoggingFile"].ToString(); 
if (!File.Exists(logFile)) 
{ 
    // ... 
    tw = File.CreateText(logFile); 
} 

答えて

4

クラリティが重要であり、DRYは(自分を繰り返さない)ことが重要です:コードは、より良い、それを説明します。これは、変数の背後にある小さくても重要な機能を隠す、ミクロ抽象です。パフォーマンスはごくわずかですが、明快さの肯定的な影響は過小評価することはできません。取得した値を保持するには、名前の付いた変数を使用します。

+0

これを追加するには、値を割り当てるための個別のステートメントがある場合は、エラーシナリオでのデバッグに役立ちます。例えば変数の値が無効でエラー/例外が発生した場合は、それをどこかで使用する前にチェックすることができます。 – vamyip

0

第二ソリューションはので、私にとっては良いです:辞書検索がコスト

  • を持って

    • それは

    それともそれはを移入プライベートコンストラクタだとあなたはシングルトンオブジェクトを持つことができ、より読みやすいです必要なすべての構成データを取得します。

  • 0

    2番目が最良の選択です。

    この次の状況を想像してください。設定は他のスレッドによって更新され、その中には設定値がロックされていないために別の値に変更されるものもあります。

    最初の状況では、実行が失敗するか、正常に実行されますが、コードが何らかの名前のファイルをチェックしていた後、以前にチェックされていないファイルに何かを保存します。これはあまりにも悪いですね。

    もう1つの利点は、値を2回取得していないことです。あなたは一度は取得し、コード全体の設定を読むためにコードが必要な場所であればどこでも使用できます。

    0

    私はかなり確信しています。第2のものは読みやすくなっています。しかし、あなたがパフォーマンスについて話すならば、初期段階やプロファイラなしでは最適化しないでください。

    0

    私は他の人に同意しなければなりません。可読性とDRYは重要であり、しばしばあなただけのオブジェクトを持ち、実際に何度もその物を保管しないことを考慮すると、変数のコストは非常に低いです。

    特殊なオブジェクトや大きなオブジェクトの例外がある可能性があります。その間にキャッシュされる値が変更される可能性がある場合、また、コード内の新しい値を知りたいかどうか(ほとんどの場合、2番目の!)を覚えておく必要があります。あなたの例では、2つの呼び出し間でConfigurationManager.AppSettings ["LoggingFile"]が変更された場合(アクセサロジックやスレッド、またはディスクからのファイルからの値の読み取りが原因)に何が起こるか考えてください。

    レジュメ:約99%のキャッシュ/キャッシュが必要です。

    0

    IMOは、キャッシュしようとしているものによって異なります。 App.congからの設定をキャッシュすることは、GPRS接続を介したWebサービス呼び出しの結果をキャッシュすること(コードの読みやすさを除いて)はあまり有益ではないかもしれません。

    関連する問題