2010-06-21 12 views
2

基於我的問題 - 把下面的代碼:C# - 如何創建一個構造函數,它們在聲明之前接受變量?

class Nevermore60Customer: GenericCustomer 
{ 
    public Nevermore60Customer(string name, string referrerName) 
    : base (name) 
    { 
     this.referrerName = referrerName; 
    } 
    private string referrerName; 
    private uint highCostMinutesUsed; 

對我來說,它出現在變量「referrrerName」正在初始化「後,」它被作爲構造函數傳遞的參數引用。

public Nevermore60Customer(string name, string referrerName) 

我是否在工作,如果是的話如何?或者如果我是正確的,並且在構造函數中被引用之後它正在被初始化,那怎麼可能?

謝謝

回答

4

變量聲明與構造函數比較的位置與C#無關。

這將使它更容易些討論,如果你的參數和字段有不同的名稱,但:

class Test 
{ 
    public Test(string parameter) 
    { 
     this.field = parameter; 
    } 

    private string field; 
} 

基本上領域的「存在」的構造函數被調用之前。如果字段聲明瞭一個初始化,這樣的:

private string field = "default value"; 

那麼初始化運行之前的構造,即使它可能會後的源代碼內。

+0

在聲明你的「NeverMore60Customer」類並且使用F11的代碼上放置一個斷點可能有助於說明這裏發生了什麼 – 2010-06-21 12:05:49

0

不知道我明白這個問題。您的構造函數具有一個strign參數referrerName,您將其分配給一個私有類變量,也稱爲referrerName。我沒有看到它的初始化之前引用this.referrerName?

0

this.referrerName指聲明爲private string referrerName;
referrerName=右側的類成員爲參數給構造。

0

無論您如何訂購類的私有成員和構造函數都無關緊要,私有成員將始終首先被初始化。

0

C#是一種面向對象的語言,您似乎將C語言過程語言的概念與C#混淆了。與C不同,在C#中,只要實例在訪問之前初始化並且在範圍內,聲明的順序就不重要。

+0

那麼,聲明的順序*可以*重要。特別是,初始化器是按照文本順序執行的......當你有部分類時,它會變得不明確。當然,這依賴於這個幾乎總是一個錯誤,但它可以有所作爲。 *方法*(或構造函數或屬性等)的位置沒有定義的差異,我知道。 – 2010-06-21 12:05:26

+0

但它們都在構造函數之前初始化並可用。 – 2010-06-21 12:20:54

2

構造函數的參數是而不是該字段的別名。它隱藏字段名稱,此代碼將不起作用:

public Nevermore60Customer(string name, string referrerName) : base (name) 
    { 
     referrerName = referrerName; // bad 
    } 

通過使用「this」。前綴,您可以告訴編譯器將參數值分配給該字段。這是一個非常普遍的模式,避免爲該論點提出另一個名稱。或者做一些尷尬的事情,比如用下劃線前綴字段名稱。

相關問題