2010-08-06 167 views
4

我知道我可以像下面的其他構造函數訪問構造函數,但有沒有辦法在構造函數體中訪問它?爲什麼不能在另一個構造函數的主體中訪問構造函數?

public Rectangle(int size) : this(size, size) 
{ 
    Console.WriteLine("Square Constructor Called"); 
    //this(size,size); i want to access like this 
} 
+0

在加入「:這個(尺寸,大小),它會調用其它的構造與 – Florian 2010-08-06 13:04:21

+1

前2個參數,我只是想表明我怎麼想的訪問。 – Freshblood 2010-08-06 13:06:02

+0

對不起,我誤解了你的問題: -/ – Florian 2010-08-06 13:13:03

回答

7

你不能那樣做。完整的理由是here,但總結:

總之,實現所需的施工控制流程很容易不添加[調用在任意位置的基礎構造的能力]做的,而且也沒有令人信服的好處添加該功能。沒有新的有趣的代表權力被添加到該語言。

2

不,你不能這樣訪問它。進一步的細節見this

4

構造函數只能鏈接一次,基本上 - 必須在構造函數本身之前指定。

通常情況下,解決想鏈,多個構造是有一個「主」的構造,所有其他構造函數鏈,最終,你可能會想這做的一切。

4

嗯,有點。如果你使它看起來像這樣:

public Rectangle(int w, int h) { 
    Initialize(w, h); 
} 
public Rectangle(int size) { 
    Console.WriteLine("blah"); 
    Initialize(size, size); 
} 
private void Initialize(...) {...} 
+0

是的,我應該定義由constroctors訪問的方法。 – Freshblood 2010-08-06 13:18:53

+2

但是請注意,'Initialize'將不被允許設置'只讀'成員,即使它只是從ctors調用過。 – AakashM 2010-08-06 13:21:18

+0

@AakashM:如果構造函數通過readonly成員作爲參考參數,它可以設置只讀成員,如果從構造函數調用的話。 – supercat 2011-07-22 23:26:18

1

我會說:「不Unfortunatally」,但它在設計的不可用。如果你不能或不想使用給定的語法,你唯一的選擇是創建一個額外的方法,它可以滿足你所尋求的構造函數。

0

:this(foo, bar)是語法糖,有什麼可以用它做什麼,你不能做其他的方式。但是,:base(foo, bar)不是語法糖,因爲它是在派生類的構造過程中調用構造函數的唯一方法,特別是考慮到您必須首先有一個完全構造的基類,它滿足在該類中定義的所有不變量(例如,如果foo的某些值對於某些bar有效,那麼在您繼續前進之前它會拋出異常)。

工作方式:base(foo, bar)使類能夠使用封裝來確保它們永遠不會進入無效狀態,同時仍然允許繼承,當存在通用代碼時,this(foo, bar)只是複製相同的機制以方便程序員不止一個構造函數。

現在,讓我們說,我們決定:this(foo, bar)從任何地方調用。它本質上是一個方法調用。那麼,無論如何,我們已經可以在類構造器中做到這一點。我們已經失去了與:base(foo, bar)的語法相似性(並且認爲有些人已經熟悉C++,這會降低他們的學習曲線),並且只是增加了一種威脅構造函數的方法,如void返回方法,增加了複雜性檢查它是在構造函數的主體中(並且必須處理人們問爲什麼當它現在看起來應該是可能的時候不能在其他地方調用它),或者當人們可以做到時無論如何創建這樣的方法。

總之,我認爲這是一個很好的設計決策。

相關問題