2012-07-12 50 views
1

我在網上閱讀(http://www.codinghorror.com/blog/2005/07/for-best-results-dont-initialize-variables.html),我們不應該初始化變量。如何避免這些變量的初始化?

不知何故,我不明白它。我經常無法避免這種情況。讓我們看一個簡單的例子:

public int test(string s) 
{ 
    int start = 0; 
    int mod = 2; 
    int output = 0; 

    foreach (int i in s) 
    { 
    output = output + (i % mod) + start; 
    start++; 
    } 

    return output; 
} 

確定它可能是廢話:-)但問題是:我可以避免初始化嗎?也許它不可能爲mod,因爲mod從一開始就必須是2並且它會留2.但開始輸出如何?我不能寫int start,因爲那總是Error Use of unassigned local variable。也許int start = null會更好,但在這種情況下,它不會工作。那麼如何避免這些東西?

+1

foreach(int我在s中)可能不會編譯? – Anton 2012-07-12 13:47:14

+4

不要打擾。這篇文章歸結爲極端的微觀優化,並且提議幾乎沒有影響。你必須編寫更多的代碼來檢查一個未初始化的'output',並且如果爲true則賦值。對於價值類型來說,這是一個100%不存在的問題。 – 2012-07-12 13:48:00

+1

int的默認值爲0。 – albertjan 2012-07-12 13:48:39

回答

5

您誤解了他的文章。在他的文章中,他特別提到了關於類的變量的初始化。在你提出的情況下,你的變量在被使用之前應該被初始化,因爲它們會被立即使用。

編輯:是的,在這個特定的情況下,int變量不需要初始化,因爲編譯器會自動初始化一個int爲0,但如果這被認爲是在不同程度上與stringDateTime,初始化就變得很重要在方法的上下文中。

+0

在這種情況下,只有返回的變量需要在從方法返回之前進行初始化。 – stevethethread 2012-07-12 13:54:10

+1

@SteveSolomon:微觀分析他的具體例子忽略了他原來的問題。用字符串或日期時間替換整數,初始化變得立即相關。 – 2012-07-12 13:55:40

+0

@HenkHolterman:在類中,是的,但在方法中,在使用它之前未明確初始化DateTime時,我收到了編譯時錯誤。 – 2012-07-12 17:25:46

5

您誤解了文章。本文討論的是成員變量(自動初始化爲默認值,因此不需要顯式初始化),但是您試圖將規則應用於局部變量(不會自動初始化,因此需要顯式初始化)。

1

你可以重寫你的方法是這樣

public int Test(string s) { 
      const int mod = 2; 
int start;     
int output = 0; 

      foreach(int i in s) { 
       output = output + (i % mod) + start; 
       start++; 
      } 

      return output; 
     } 

在這種情況下,開始變量不需要被初始化,這是事實無論是在內部或外部範圍聲明。

但是,由於輸出變量將由方法返回,因此輸出變量確實需要初始化,並且如果循環從不運行,變量將永遠不會被初始化。

+0

'int output;'就足夠了,默認爲0 – albertjan 2012-07-12 13:50:50

+0

@the_ajp錯誤使用未分配的本地變量 – miri 2012-07-12 13:52:55

+0

嘗試一下,看看它不會編譯。 for循環可能永遠不會執行,所以輸出在返回之前永遠不會被初始化。 – stevethethread 2012-07-12 13:57:18

-2

本文正在討論不使用默認值初始化變量。例如,

int x = 0; 

不好。此外,您應該在它的使用是一個乾淨的代碼之前初始化(並聲明)該變量。

構造函數中的初始化不只是在使用之前。