2010-03-18 48 views
5

當我們做一些像double.IsNaN - 究竟發生了什麼?double.IsNaN - 編譯器在這裏做什麼

如果double是一個類,我會理解它,但double是一個結構,它是一個值類型,所以C#如何實際上調用一個值類型的靜態方法?

+1

問題是什麼?結構和類都可以有靜態方法 – 2010-03-18 09:45:05

回答

5

結構可以有方法。

...

只是櫃面需要一個例子:

struct Foo { 
    public void Hey() 
    { 
     Console.WriteLine("hey"); 
    } 

    public static void DoSomething() 
    { 
     Console.Read(); 
    } 
} 
+1

更具體。結構也可以有STATIC方法。它調用這個靜態方法 - 它檢查雙結構中的位是否與指示NAN的位相同。 – TomTom 2010-03-18 09:45:13

0

從這裏:http://social.msdn.microsoft.com/forums/en-US/clr/thread/16ffdb1f-119c-407e-b9f7-b9c79fec0e94/

其實當你調用一個結構的靜態 方法,調用之前以下 步驟發生:1, CLR初始化運行時類型信息結構稱爲 CORINFO_CLASS_STRUCT包含幾個 類型的關鍵部分,包括 的靜態方法指針。

2.您調用靜態方法將被路由到方法 由JIT編譯的儀器(如果 您的聲明不是nGENed)。

在這個過程中,沒有涉及構造函數 。

0

所有數據類型都繼承自Object基本類型,因此任何數據類型都具有類似於對象的行爲,因爲它可以具有方法和屬性。

Double這樣的結構不會直接從Object繼承,而是從ValueType繼承,這會使編譯器將數據類型視爲簡單值。這改變了數據的存儲方式,並且在一定程度上限制了對象的功能。一個結構可以例如不具有虛擬方法,因爲數據沒有像對象那樣用指向虛擬方法表的指針進行修飾。儘管如此,結構仍然可以具有常規的方法和屬性。