2013-04-22 15 views
0

在C#中,當我創建一個空的類但它提供了一個默認的構造函數時我提供默認的構造函數不再創建參數的構造函數。爲什麼會出現並不總是默認的構造函數

我的問題是:

  1. 爲什麼編譯器不再給我默認的構造函數呢?
  2. 是否有一個設置,以便始終生成此默認構造函數?

這些問題源於WCF的工作,我需要默認的構造函數,但也希望能夠提供一個構造函數的值,這將是很好的不必每次都放置默認的構造函數,我wouldn不認爲未使用的默認構造函數會造成很大的開銷。

+0

一個澄清:它的WCF的默認IInstanceProvider需要一個默認的服務構造...它不是框架本身的限制。您可以使用自定義IInstanceProvider來解決此限制。 – ErnieL 2013-04-22 02:35:23

回答

2

有一個定製的構造(通常)意味着該對象的內部狀態與你通過構造參數提供一些定製信息初始化。如果在這種情況下仍然有默認構造函數,那麼初始狀態會是什麼?

如果您沒有自定義構造函數,那麼假設您只是使用默認構造函數,因爲沒有內部狀態進行初始化,所以它被認爲沒問題。

0

沒有設置。

在某些情況下,默認的構造是執行該數據中指定一個合同的方式。

0

默認的構造函數的存在方式是,以及...默認。但是,如果您創建自己的參數化構造函數,那麼編譯器會假定您想使用該構造函數,並且不再發出默認構造函數。

如果你想有一個默認與WCF使用,你必須指定它。在它中,如果您願意,可以使用一些默認值調用您的參數化構造函數。

0

在C++,C++,Java及其後代語言中,我們寫了一個自定義構造函數,因爲需要確保該對象已初始化並處於一致狀態。編譯器無法猜測它應該如何初始化對象,所以它甚至不嘗試。有很多方法可以同時爲類設置默認構造函數和自定義構造函數。

的Java有一個互相引用的構造函數:

public Name(String givenName, String middleName, String surName) {...} 
public Name(String givenName, String surName) { 
    this(givenName, null, surname); 
} 

C++ 11引進了委派構造函數,用於做同樣的事情。 C++一直有默認參數,它也可以做同樣的事情。 C♯似乎只有默認參數。

其他語言使用約定:Objective-C的有程序員編寫初始化所有在指定初始化的條款。

總之,總有辦法做到這一點,但你必須手動將其編程。沒有自動方案存在。

0

如果您沒有爲您的類提供任何構造函數定義,編譯器將只創建默認構造函數。原因可能是:當你需要創建對象的實例時,你需要調用構造函數,所以如果沒有編碼器定義的構造函數,編譯器會添加它來使其工作。

但是,一旦你已經定義了一個構造函數,告訴用戶認識到必須構造的,因此默認的構造函數不會被自動添加編譯器。您需要手動插入您自己的默認構造函數。我不認爲有這樣的設置。

相關問題