2009-10-28 7 views
1

在這個問題範圍中,數據類是一個比方法具有更多公共屬性的類。我應該實現一個構造函數還是使用數據類的默認值?

我應該:

public class Complex 
{ 
    public double Real { get; set; } 
    public double Imaginary { get; set; } 
} 

或者:

public class Complex 
{ 
    public double Real { get; set; } 
    public double Imaginary { get; set; } 
    public Complex(double real, double imaginary) 
    { 
     this.Real = real; 
     this.Imaginary = imaginary; 
    } 
} 
+0

不應該只是一個結構嗎? – 2009-10-28 13:56:39

+0

@Brian也許,這只是一個例子,不是問題的主要關注點。 – 2009-10-28 14:05:20

回答

3

在C#3.0中提供的新對象的初始化我沒有看到無關緊要的構造函數的需要了。除非你需要做一些自定義的初始化邏輯,否則我不會添加它。

在你的情況,你可以使用第一類定義和等,它們執行初始化:

var c = new Complex { Imaginary = 1, Real = 2 }; 

在這裏你可以找到如何使用「新」對象初始化一個例子:http://www.developer.com/net/csharp/article.php/3605011/One-Step-Object-Creation-and-Initialization-in-C-30.htm

3

我認爲這取決於你是否需要這些值進行初始化。您不能依賴於設置的實數和虛數值,而不顯式強制它們在構造函數中設置。從技術上講,有人可以在構造函數中將它們設置爲任意值,這可能會導致問題,但通過強制它們在構造函數中設置,您基本上會說「嗨!這些值對於該對象很重要」。

+0

我同意你的意見。 – 2009-10-28 14:00:26

0

那麼,在複數的情況下,我會爭辯說它應該是一個不可變的struct,而不是帶有setter的class。因此,它需要在構造函數中初始化它的值。

但是,如果你正在談論代表應該是可變的東西class,那麼它並不重要。我的首選是創建一個構造函數,以便很容易發現需要設置哪些字段來初始化對象。

3

在您的例子的情況下,複數,我想使它成爲一個不可改變struct來代替:

public struct Complex 
{ 
    private readonly double _real; 
    public double Real 
    { 
     get { return _real; } 
    } 

    private readonly double _imaginary; 
    public double Imaginary 
    { 
     get { return _imaginary; } 
    } 

    public Complex(double real, double imaginary) 
    { 
     _real = real; 
     _imaginary = imaginary; 
    } 
} 

更一般地,我會說,如果某些屬性,以便需要的對象是被認爲是有效的,然後有一個構造函數接受這些值並設置適當的屬性。

1

如果你有一個純數據類,我更喜歡builder模式來構建它們。一些其他類的功能,收集重要的數據,然後生成一個聲音的新對象。

但是,如果您使用公共可變屬性,這可能是過度殺傷,因爲程序的每個部分都可能會更改對象,而無需使用機制來確保對象在更改後聲音良好。

因此,最重要的是確保初始化代碼不會在整個程序中被重複使用。

0

兩者。或者,這取決於。

編寫更少的代碼總是一件好事,所以依靠默認的構造函數是一個好主意。不過,也要考慮你將會使用這個課程的地方。這些似乎更容易?

  1. Complex c = new Complex { Real = 1d, Imaginary = 0.5 };
  2. Complex c = new Complex(1d, 0.5d);

前者是在更明確的,你可以很容易地看到哪些值的屬性,但它也不再寫作。

然後還有控制對象狀態的問題。通過使用屬性和默認構造函數,你不能真正聲明強制屬性。有人可能會認爲這對於數據對象來說不是必需的,但根據你將如何使用它,這可能很重要。個人而言,我傾向於用空構造函數創建我的數據傳輸對象(它們幾乎不是對象),以使序列化更容易,以及我在整個代碼中使用的便捷構造函數。對於我的值對象,我只使用具有強制屬性的顯式構造函數,以便確保有效狀態。

0

同意凱文 - 這要看。在場景1中,你的設計說「你可以隨意改變這些值」,在場景2中,它說「你需要從頭開始給我一些值」。在場景2中,我可能會將設計更改爲這樣的東西,否則,構造函數不會爲您購買任何東西:

public class Complex 
{ 
    public double Real { get; private set; } 
    public double Imaginary { get; private set; } 
    public Complex(double real, double imaginary) 
    { 
     this.Real = real; 
     this.Imaginary = imaginary; 
    } 
} 
相關問題