2014-01-29 209 views
-1

你好,對於混亂的標題感到抱歉,我無法正確表達我想說的話。 關於這個問題,我應該如何理解這個片段?無參數重載構造函數調用參數化一個?

public class Node 
{ 
    public long Id { get; private set; } 
    /// Creates a Node which has the supplied id. 
    public Node(long id) : this() 
    { 
     Id = id; 
    } 
/* */ 
} 

如果我沒有錯;當使用參數化構造函數創建節點時,this關鍵字應該調用相同的方法,但不包含參數,我認爲該參數應默認爲默認(sic)空構造函數。最後,它看起來像是調用空的默認構造函數的另一種方式,這是毫無意義的。 如果相反,構造函數按預期工作,Id成員如何實例化?

完整的源代碼是在這裏:http://sourceforge.net/p/satsumagraph/code/ci/master/tree/src/Graph.cs#l38

+2

您當前的代碼沒有默認構造函數*(參數less)*,並且您應該會看到一個錯誤:'Node'不包含一個構造函數,其中包含0個參數 – Habib

+1

該代碼不是實際的代碼 - 您能顯示真實的,實際的代碼? –

+0

請注意,Graph.cs類中的實際代碼顯示Node是結構體,而不是類:http://sourceforge.net/p/satsumagraph/code/ci/master/tree/src/Graph.cs –

回答

6

在您的實際代碼,Nodestruct,不是一類。

在這種情況下,需要將調用添加到默認構造函數。沒有它,你會得到一個消息,說明對象「在所有字段分配給它之前不能使用」,因爲你正在使用值類型的自動屬性。這是因爲編譯器添加了一個後臺字段,並且該字段必須在可以訪問該屬性之前進行初始化。構造函數試圖在字段初始化之前設置屬性。每個struct都包含一個默認構造函數,並將其調用爲「初始化」自動屬性的後臺字段,以使其正常運行。

class,如你所示,這是不必要的(甚至不編譯)。

+0

完美,畢竟這是我的讀書錯誤。感謝您的解釋! – Harter

0

根據msdn: -

A constructor can invoke another constructor in the same object by using the this keyword. Like base, this can be used with or without parameters, and any parameters in the constructor are available as parameters to this, or as part of an expression.

當你編譯上面的代碼,它應該給你一個錯誤,因爲你還沒有定義參數的構造函數。

因此,當你這樣做: -

public Node(long id) : this() 
    { 
     Id = id; 
    } 

您正在試圖調用參數的構造函數,你還沒有定義。

相關問題