2011-02-02 100 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 2011-02-02 14:50:12

0

第二個解決方案是對我來說更好,因爲:

  • 字典查找具有成本
  • 它更可讀

或者你可以有一個單獨的對象與它的私有構造函數用於填充一旦你需要所有的配置數據。

0

第二個將是最好的選擇。

想象一下這種下一種情況。設置由其他線程更新,在其中一些線程中,由於設置值沒有鎖定,所以更改爲另一個值。

在第一種情況下,你可以執行失敗,或者它會被執行罰款,但代碼是檢查一些名稱的文件,後來什麼保存到文件中,這不是一個前檢查。這太糟糕了,不是嗎?

另一個好處是,你不檢索值的兩倍。你得到一次,並且你使用你的代碼需要讀取整個設置的地方。

0

我很確定,第二個更具可讀性。但是,如果您談論性能 - 不要在早期階段進行優化,也不要使用Profiler。

0

我必須同意其他。可讀性和DRY非常重要,考慮到通常你只需要Object而不是多次存儲它,變量的代價非常低。

有可能是有特殊或大型物體例外。你必須記住這個問題,如果你緩存的值可能會在兩者之間變化,並且你是否願意(大部分時間在第二!)知道你的代碼中的新值!在你的例子中,想一想當ConfigurationManager.AppSettings [「LoggingFile」]在兩次調用之間改變時(由於訪問者邏輯或線程或始終從磁盤讀取文件中的值)可能發生的情況。

Resumee:約99%,你會希望第二個方法/緩存!

0

IMO這將取決於你試圖緩存。緩存來自App.conig的設置可能不如通過GPRS連接緩存Web服務呼叫的結果那樣有益(除了代碼可讀性)。