2011-07-24 37 views

回答

7

因爲CLR只能在運行時確定的大小...的原因,這是一個「填充」(依賴於平臺)...

對於所有其他類型,包括結構情況下,sizeof運算符可以是 僅用於不安全的代碼塊。雖然可以使用Marshal.SizeOf方法,但此方法返回的值並不總是 ,與sizeof返回的值相同。 Marshal.SizeOf在封送類型後返回 大小,而sizeof返回 大小,因爲它已由公共語言運行庫分配,其中包括任何填充

Ref

也看到How do I check the number of bytes consumed by a structure?

+1

msdn ...添加引用... –

+0

感謝:-)添加了第二個參考 – Yahia

+0

這也意味着'sizeof(DateTime)'在'unsafe'上下文中可以正常工作(請參閱我的新答案)。 –

1

完整的錯誤文本你,就是:

錯誤CS0233:「System.DateTime的」沒有預定義的大小,因此 的sizeof只能在一個使用不安全的情況下(考慮使用 System.Runtime.InteropServices.Marshal.SizeOf)

所以,如果你使用unsafe上下文(一定要到C#項目的「公關operties」,‘生成’選項卡,並設置在一個對勾‘允許不安全的代碼’,使下面編譯)正常工作:

static void Main() 
    { 
     int s; 
     unsafe 
     { 
      s = sizeof(DateTime); 
     } 
     Console.WriteLine(s); // writes 8 
    } 

隨着unsafe關鍵字,sizeof()將與所有enum工種與所有struct類型沒有引用類型的實例字段(並且DateTime肯定是一個沒有引用類型成員的結構)。

如果沒有unsafe關鍵字,則不能使用sizeof。 (然而,由於C#2你被允許使用預先定義的類型,如intenum類型,但不能在其他結構類似DateTime,因爲你所看到的。)


注意,DateTime結構是例外情況是Marshal.SizeOf<DateTime>()(或.NET版本4.5.1(2013)之前的Marshal.SizeOf(typeof(DateTime)))將引發異常。這是因爲不尋常的(對於struct)結構佈局「自動」。

0

Alex Pinsker寫nice solution獲得DateTime(或任何其他類型)的大小。

相關問題