將不確定(ding)變為確定(ding)~對(dui)象被new后什么(me)時候會拋(pao)System.NullReferenceException
這可能(neng)并不是一(yi)個(ge)(ge)問題(ti),因為它(ta)(ta)很多時(shi)間會(hui)(hui)被(bei)我們(men)(men)所忽視,我們(men)(men)在開(kai)發時(shi),在頁面上(shang)使(shi)(shi)(shi)用(yong)(yong)(yong)一(yi)個(ge)(ge)對(dui)象的(de)一(yi)個(ge)(ge)屬(shu)性(xing),當對(dui)象被(bei)new后,可能(neng)還沒有(you)賦值也可能(neng)返回給(gei)它(ta)(ta)的(de)值為null,那(nei)這時(shi)使(shi)(shi)(shi)用(yong)(yong)(yong)它(ta)(ta)里(li)面的(de)屬(shu)性(xing),它(ta)(ta)會(hui)(hui)拋(pao)System.NullReferenceException嗎?當我們(men)(men)對(dui)象不為null,我們(men)(men)使(shi)(shi)(shi)用(yong)(yong)(yong)這個(ge)(ge)對(dui)象的(de)子對(dui)象,這個(ge)(ge)子對(dui)象如果(guo)為null,使(shi)(shi)(shi)用(yong)(yong)(yong)它(ta)(ta)的(de)屬(shu)性(xing),它(ta)(ta)會(hui)(hui)拋(pao)System.NullReferenceException嗎?
這是一個(ge)看似簡單的問題(ti),但對于它的結果可能(neng)我們一時并不能(neng)確定(ding),還是用機器來證明它吧
兩個類型:
1 /// <summary> 2 /// 小u 3 /// </summary> 4 class u 5 { 6 public string name { get; set; } 7 public int age { get; set; } 8 }
/// <summary> /// 大U /// </summary> class U {
public int ID { get; set; }
public string RealName{get;set;}
/// <summary> /// 小u是(shi)大(da)U的(de)屬性 /// </summary> public u u { get; set; } }
1 U u = new U(); 2 Console.WriteLine(u.ID); 3 Console.WriteLine(u.u.age);
我們(men)(men)可以看到小u是(shi)大U的(de)一(yi)個屬性(xing),我們(men)(men)建立(li)大U時,如果不為小u賦值,它是(shi)null,而(er)屬性(xing)ID默認值為0,我們(men)(men)輸出(chu)看一(yi)下
因為(wei)u是null,所以,我們輸出(chu)u中的屬性會怎(zen)樣?
Console.WriteLine(U.u.age);
OK,這時(shi),系(xi)統就會(hui)拋出異常了,未將對象(xiang)設置到對象(xiang)的實例上,呵(he)(he)呵(he)(he),一個(ge)結(jie)論產生:
當對象被new后,它內部的簡單類型的屬性可以訪問,輸出它的默認值,而復雜類型的屬性,如果為null,它也是不能訪問的!