2012-11-29 66 views
0

可能重複:
Is there a reason why NullReferenceException does not give the name of the variable?C#編譯器相關的對象引用不設置到對象的實例

爲什麼還要更高層次的語言,如C#或Java想不出容易提供一種機制來發現哪個對象類型和實例(變量)爲空?我們是否需要爲此編寫自定義邏輯。

ex: SampleClass sc = null; 
     sc.SomeMethod(); 

我想說「對象類型的SC SampleClass爲空」,而不是一個天真的異常消息「對象引用不設置到對象的實例。」

+0

可能的重複[是否有一個原因,爲什麼NullReferenceException不給變量的名稱?](http://stackoverflow.com/questions/5257626/is-there-a-reason-why-nullreferenceexception-does- not-the-name-of-the-varia),還有[爲什麼NullReferenceException不包含有關什麼是null的信息?](http://stackoverflow.com/questions/4719047/why-doesnt-nullreferenceexception-contain - 信息 - 關於 - 什麼 - 是空的) – Rawling

回答

0

因爲在大多數情況下並非如此簡單。

採取這種方法,例如:

public int Foo(string bar) 
{ 
    return bar.Length; 
} 

bar可以根據僅在運行時已知的因素null。這是編譯器無法驗證的。

2

這裏的術語很值得一提。 sc不是一個對象,它是一個變量。變量的值是一個參考。引用可能爲空,或者它可能是對真實對象的引用。現在

,至於爲什麼它並不像聽起來那麼簡單......

在此代碼:

sc.SomeMethod(); 

...有兩個操作:

  • 負載值sc到執行堆棧上
  • 通過執行堆棧上的引用執行SomeMethod

這是第二次操作失敗,並且該操作並不真正瞭解第一次操作。

當涉及更多操作時,情況會變得更糟。怎麼樣:

Foo().Bar().SomeMethod() 

你會期望在這種情況下顯示異常?

就我個人而言,我很少發現很難找出異常來自哪裏 - 行號通常使得它相當清楚,並且其中而不是明確的情況通常恰恰是存在長表達的情況無論如何,在例外情況下都不能輕易給出單個答案。

我想這將是可能爲CLR /編譯器同意一個額外的表,如行號映射,它說:「對於IL指令X,執行堆棧的頂部是從一個表達式與診斷消息Y「。感覺這會很麻煩 - 就像我說的那樣,它不應該讓你感到頭疼。

相關問題