2013-03-03 36 views
3

我是C#的新手,並且正在閱讀the article about the virtual keyword at the MSDN。在他們的示例代碼中,他們創造了以下類:添加沒有任何參數的構造函數有什麼好處嗎?

public class Dimensions 
{ 
    protected double x, y; 

    public Dimensions() 
    { 
    } 

    public Dimensions(double x, double y) 
    { 
     this.x = x; 
     this.y = y; 
    } 

    public virtual double Area() 
    { 
     return x * y; 
    } 
} 

爲什麼他們添加的第一個構造函數(即不需要任何參數的那個)?我得到這兩個雙值xy默認爲0,所以添加這個構造函數不會傷害。但是我現在已經看到了這麼多次,因此想知道總是添加這樣的構造函數是否有任何特殊原因?我應該一直這樣做嗎?

+0

[我們是否應該總是在類中包含默認構造函數?](http://stackoverflow.com/questions/3692042/should-we-always-include-a-default-constructor-in- ) – Niko 2013-03-03 11:29:47

回答

2

你應該總是做到了嗎?當然不。如果沒有這種構造函數有效的情況,則不應包含無參數構造函數。

所以,如果有可以設置的理智的默認值,那似乎很有用,那麼繼續創建它。如果不是這樣,將其退出,以強制客戶端提供適當的參數。

請注意,有一些外部因素可能需要無參數的構造函數。例如,許多類型的序列化。

10

默認情況下,類包含默認構造函數。當您添加參數化構造函數時,default provided構造函數不再存在。因此,如果你需要一個無參數的構造函數,你需要手動添加它,一旦你添加了參數化構造函數。

所以,要完全回答你的問題。不,你不需要添加默認的構造函數。但在這種情況下,該類的作者允許創建一個新的Dimensions對象,其中值默認爲0


作爲一個側面說明弗拉德的回答關於系列化:

如果您有隻序列化目的的參數的構造函數的需要,這是好事,知道你可以標記構造如private(或protected)構造函數。序列化(或在這種情況下的反序列化)可以訪問private構造函數,而業務邏輯則不能。這樣你就不必「污染」你的業務邏輯界面。

+0

謝謝你的所有細節! – Niko 2013-03-03 11:33:18

1

當您第一次創建對象時(例如 - 序列化),您可能不知道這些值是否能夠設置它們。 如果您創建了一個重載的構造函數,那麼默認的構造函數不會爲您自動創建 - 所以您需要自己創建它。請參閱: Should we always include a default constructor in the class?

+0

感謝您的鏈接,這是基本相同的問題(不知道它被稱爲「默認構造函數」)。 – Niko 2013-03-03 11:30:47

2

在某些情況下,仍然需要不帶參數的構造函數(缺省構造函數)。其中一種情況是serialization

閱讀說明here

在對象的反序列化,該類負責 反序列化對象創建序列化類 的一個實例,然後繼續填充序列化字段和屬性 只有在獲得一個實例來填充之後。

如果你願意,你可以讓你的構造函數是私有的或內部的,就像它的無參數那麼長。

+0

+1序列化示例:) – bas 2013-03-03 11:24:39

+0

謝謝你的例子! – Niko 2013-03-03 11:32:01

+0

@Niko upvote是一個很好的方式來說聲謝謝;) – VladL 2013-03-03 11:39:15

相關問題