2012-02-08 130 views
0

如果有多個構造函數,調用其中一個構造函數的優點是什麼? 謝謝由其他調用構造函數

+3

那麼,從另一個調用一個*方法的優點是什麼?構造函數只是*方法*,它們在生成'new'運算符的結果之前被調用。 – 2012-02-08 16:05:43

回答

6

相同的優點,當你做方法重載:如果您想通過默認值基本構造你不要重複相同的代碼

public class Person 
{ 
    public Person(string name,string lastName) 
    { 
     Name = name; 
     LastName = lastName; 
    } 

    public Person(string name, string lastName,string address):this(name,lastName) 
    { 
     //you don't need to set again Name and Last Name 
     //as you can call the other constructor that does the job 
     Address = Address; 
    } 
    public string Name { get; set; } 
    public string LastName { get; set; } 
    public string Address { get; set; } 
} 
8

你不重複自己。

實現一個構造函數的改變也會立即影響所有其他的構造函數。 複製和粘貼代碼不好,應該避免。你

+0

相關:http://stackoverflow.com/questions/2490884/why-is-copy-and-paste-of-code-dangerous/2490897#2490897 – Oded 2012-02-08 15:52:03

1

public class YourClass 
{ 
    private int SomeInt; 

    public YourClass() : this(0) 
    { 
     // other possible logic 
    } 

    public YourClass(int SomeNumber) 
    { 
     SomeInt = SomeNumber; 
    } 
} 

這遵循了DRY原則(不要重複自己)。一個簡單的例子,但它應該說明這個想法。

1

我使用它時,我想將默認值或空值傳遞給其他構造函數。在上面的情況下,用戶在調用構造函數時不必傳遞null - 他們可以不用任何東西來調用它。

public class Widget(){ 

    public Widget() : this(null){ 

    } 

    public Widget(IRepository rep){ 
     this.repository = rep; 
    } 
} 
3

縱觀已經發布的答案我只是將它們與您總是走的方式,從默認的構造函數下降到最專業的構造函數。試圖做同樣的其他方式總是導致代碼複製或問題:

的好辦法:

public class Foo() 
{ 
    public Foo() 
     : this(String.Empty) 
    { } 

    public Foo(string lastName) 
     : this(lastName, String.Empty) 
    { } 

    public Foo(string lastName, string firstName) 
     : this(lastName, firstName, 0) 
    { } 

    public Foo(string lastName, string firstName, int age) 
    { 
     LastName = lastName; 
     FirstName = firstName; 
     Age = age; 
     _SomeInternalState = new InternalState(); 
    } 
} 

糟糕的方法:

public class Foo() 
{ 
    public Foo(string lastName, string firstName, int age) 
     : this(lastName, firstName) 
    { 
     Age = age; 
    } 

    public Foo(string lastName, string firstName) 
     : this(lastName) 
    { 
     FirstName = firstName; 
    } 

    public Foo(string lastName) 
     : this() 
    { 
     LastName = lastName; 
    } 

    public Foo() 
    { 
     _SomeInternalState = new InternalState(); 
    } 
} 

的問題第二個例子是該部分如何處理所有的參數現在已經混淆了所有的構造函數,而只是實現了一個(最專業的)。試想一下,你喜歡從這個課程中派生出來。在第二個示例中,您必須覆蓋所有構造函數。在第一個示例中,您只需重寫最專業的構造函數即可完全控制每個構造函數。

+0

我不是這個例子的粉絲。你可能應該以另一種方式級聯。從最高的參數#到最低的 – Kyle 2012-02-09 00:08:44

+2

@Kyle:NNNOOOOOOOO。如你所建議的那樣做會導致問題。看到我更新的答案。 – Oliver 2012-02-09 08:20:24

+1

優點與重載 – Kyle 2012-02-16 21:43:38