2010-09-23 120 views
1

在本書中,我發現了以下(翻譯):C#變量初始化VS分配

初始化指在申報時分配變量的值。 int X=5被稱爲初始化命令。

編輯:它只是說,只有當你在聲明時賦值項初始化時使用。如果你以後這樣做,它的正義分配(根據它 - 我不這麼認爲,這就是爲什麼我問)。這是真的還是不?

嗯,我一直認爲(並根據網絡上的其他人)初始化的一個值的變量的第一次賦值條款。我認爲int X=5只是作爲聲明的一部分。

我試圖在MSDN上搜索沒有運氣。感謝您的任何信息。

+0

目前尚不清楚你在說什麼顯着差異。你能詳細說明一下嗎? – 2010-09-23 15:02:44

+2

你能說清楚你在這裏問什麼嗎?實際上你沒有在你的帖子中提過一個問題。 – Oded 2010-09-23 15:03:00

回答

5

如果你所問的只是術語(*這不是你的問題真的很清楚),那麼變量的「初始化」實際上是第一次給它賦值。這個術語來自於您將變量賦予「初始」值的事實。

這應該(顯然)在第一次使用之前發生。

int x=5; 

是一個聲明和初始化,並且是

int x; 
x=5; 
+1

是的,我認爲是。在這方面,如果說初始化只是在聲明時使用,那麼這本書是錯誤的。 – Thomas 2010-09-23 15:06:34

0

在一般情況下,其實只是方便的速記初始化,如果第一次的變量被分配到,無論是明確的程序或隱式編譯器/運行時。然而,初始化機制對於理解特別是在處理類時尤爲重要。考慮下面的簡單例子(在某處創建'Bar'的實例)以查看編譯器如何執行初始化過程。您會注意到這些字段是在初始化時聲明的,並且在構造函數有機會設置它們之前,所有字段都被「初始化」。

public class barBaseBase 
{ 
    protected int x = 5; 
    public barBaseBase() 
    { 
     x = 4; 
    } 
} 

public class barBase : barBaseBase 
{ 
    protected int y = 4; 
    public barBase() 
    { 
     x = 3; 
     y = 2; 
    } 
} 

public class Bar : barBase 
{ 
    protected int z = 3; 
    public Bar() 
    { 
     x = 2; 
     y = 1; 
     z = 0; 
    } 
} 
3

通常,初始化變量是聲明後的第一次賦值,因爲變量不會自動初始化。後續任務只是任務。

void foo() { 
    int i;//not initialized. 
} 

不包括fields,它們是在類或結構中聲明的變量。在調用該對象實例的構造函數之前,它們被初始化爲default values。因此,即使您(首先)在構造函數中爲某個字段分配了某些內容,並且該字段未在聲明中初始化,但嚴格來說就是賦值而不是初始化。沒有進入這樣的細節,我想很多程序員確實將構造函數中的一個字段的第一次賦值當作初始化,並且可能在它們的對話中使用它。可能這種用法/習慣源於使用非託管語言,如C/C++,其中變量在首次聲明時包含亂碼,因此它們必須用非垃圾值(初始化)填充它。

class A { 
    int x;//not initialized 
    int y = 1;//initialized here 
    A() { 
     x = 1;//strictly speaking, not initialization, just assignment. 
     y = 2;//was obviously initialized above 
    } 
} 

對於程序員不寫編譯器或語言,能夠與其他程序員進行有效的溝通比會意字初始化確切的術語更重要。因此,請繼續使用它,意思是你身邊的每個人都能理解。儘管解釋確切的含義不會錯(但我可能不會因爲害怕暴露我的迂腐傾向)。

就我個人而言,我會避免使用術語「初始化命令」作爲變量的書。

0

請注意,初始化字段會導致C#編譯器爲每個構造函數發出初始化IL指令。所以如果你有多個構造函數,你將會重複初始化IL - 即不必要的代碼膨脹。

更好地初始化默認構造函數中的變量,並讓其他構造函數調用它。