2015-05-08 52 views
2

我只是嘗試在C#中有些東西創造爲同一類對象,我碰到這個地方我已經在類本身C#中的類本身

class Class1 
    { 
     public int test1 { get; set; } 
     Class1 x = new Class1(); 
    } 

,然後創造了同一個類的對象我試圖創建從其它類對象,其引發錯誤

類型「System.StackOverflowException」 的未處理的異常發生在將Test.exe

class Program 
    { 
     static void Main(string[] args) 
     { 
      Class1 x = new Class1(); 
     } 
    } 

我已經google了,我還沒有找到任何與c#相關的鏈接,但我發現它在C++中,他們說一個Class1是一個不完整的類型,因爲它尚未定義,而是被定義。我想知道它的C#相同的情況下,是否也

+0

只是好奇,爲什麼你創建一個'新的Class1() '在你的對象的每個實例中? – ryanyuyu

回答

9

Class1創建一個Class1,創造另一個Class1,創造另一個Class1,這...

因此,每個構造函數調用被添加到執行堆棧直到它溢出。

既然你沒有指定你想要的與實例沒有辦法知道什麼是正確的答案。

爲了獲得良好的怪胎幽默,谷歌recursion

+0

這背後沒有真正的原因。我剛剛試圖看看會發生什麼。 – Vivekh

4

它是非常簡單的,你的問題是每次創建Class1時間,該對象創建自己Class1。因此,你要緩解,直到你炸燬。

您可以調試它並觀察發生了什麼。在某個地方設置一個斷點在Class1之內,並觀察它會一遍又一遍地被擊中。

3

一個類可以包含它自己的一個對象,但是你不能在構造函數中或聲明時實例化該對象。這將導致無限遞歸和StackOverflow異常。

你可以有一個單獨的方法來實例化,如:

class Class1 
{ 
    public int test1 { get; set; } 
    private Class1 x; 

    public void CreateClass1() 
    { 
     x = new Class1(); 
    } 
} 

,然後調用它像:

Class1 obj = new Class1(); 
obj.CreateClass1(); 
1

只是不創造Class1實例的過程中創建的Class1實例。把一個佔位符代替:

class Class1 
{ 
    public int test1 { get; set; } 
    public Class1 AnotherClass1; 
} 

並提供參考到另一個(已創建的實例),或者創建之後或創建作爲構造參數期間:

static void Main(string[] args) 
{ 
    Class1 x = new Class1(); 
    x.AnotherClass1 = new Class1(); 
}