我不知道的C#-構造方法中調用虛方法
class Program
{
static void Main(string[] args)
{
try
{ B b = new B(); }
catch(Exception ex)
{Console.WriteLine(ex.GetType().ToString()); }
Console.Read();
}
class A
{ protected Ref my;
public A()
{ my = new Ref();
Console.Write(ToString()); }
public override string ToString()
{ return my.ToString(); }
}
class B : A
{ private Ref my2;
public B() : base()
{ my2 = new Ref();}
public override string ToString()
{return my2.ToString();}
}
//一個對象引用
class Ref
{ public string s = "我是一個對象";}
}
運行以上代碼會出現異常,原因很簡單,類A是其他類的基礎類,但是在類A的構造函數中調用了虛方法ToString(),導致程序出錯。原因是在執行new B(); 時的執行順序是首先初始化自己的保護變量my然后調用基類的構造函數A(),最后再執行自己的構造函數B(),問題處在調用基類構造函數A()的時候整個對象類型任然保持了真是的類型B,CLR執行類型A的虛方法ToString()的時候會去找它自身的虛方法,就是類型B的ToString()方法,但是此時B的構造過程還沒有結束它是不可能調用到這個ToString()虛方法的,對于未構造成員的訪問將會產生異常。
避免這種異常的方法是在將會被集成的類的構造函數中永遠不要使用虛方法。
作者:Tyler Ning
出處:http://www.rzrgm.cn/tylerdonet/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,請微信聯系冬天里的一把火
浙公網安備 33010602011771號