2014-09-24 81 views
-7
namespace ConsoleApplication1 
{ 

class class1 
{ 
    protected internal string inf1() 
    { 
     Console.WriteLine("\n......inf1() \n"); 

     return inf1(); 
    } 
} 




class class2 :class1 
{ 
    static void Main(string[] args) 
    { 
     class1 c1 = new class1(); 

     class2 c2 = new class2(); 

     Console.WriteLine(c1.inf1()); 

     Console.WriteLine(c2.inf1()); 

     Console.ReadKey(); 
    } 
} 

獲取無限循環問題。進程因StackOverflowException而終止?獲取無限循環問題。進程由於StackOverflowException而終止?

如何防止代碼無限循環?

+5

是的,inf1被遞歸調用,因此導致無限循環,所以堆棧溢出是預期的行爲。你的問題是什麼,或者你不明白什麼? – 2014-09-24 12:12:58

+3

你的代碼顯然有無限遞歸,方法inf1總是執行自己,你期望發生什麼? – 2014-09-24 12:13:24

+1

這是什麼意思?你想要在父類中調用一個方法嗎? – Luaan 2014-09-24 12:17:17

回答

0

class2,你打電話給Console.WriteLine(c1.inf1());

因此class1.inf1應該返回一個字符串,因爲您試圖將其輸出到控制檯。

但是,class1.inf1()以無退出的方式遞歸調用自身並且不返回字符串。

所以我覺得這可能是你所要完成的任務:

protected internal string inf1() 
{ 
    return "\n......inf1() \n"; 
} 
+0

感謝您的幫助。現在我已經理解了無限循環背後的原因。 – sunil 2014-09-24 12:25:50

0

的問題是在這裏:

protected internal string inf1() 
{ 
    Console.WriteLine("\n......inf1() \n"); 
    return inf1(); 
} 

這個方法返回一個調用本身每次這意味着它會被稱爲無限期。問題在於,程序在進入方法之前會將當前在內存中的位置添加到堆棧中,以便當方法返回時它可以返回到那個地方並從那裏繼續,但該堆棧並非無限且所以你的問題方法會變得完整,程序會崩潰,因爲沒有堆棧它不能繼續運行。