2014-02-19 27 views
12

結構System.DateTime及其表親System.DateTimeOffset的結構佈局類型設置爲「自動」。這可以看作與:爲什麼System.DateTime結構的佈局類型爲Auto?

typeof(DateTime).IsAutoLayout /* true */ 

或:

typeof(DateTime).StructLayoutAttribute.Value /* Auto */ 

,或者它可以從其中聲明瞭IL中可以看出:

.class public auto ansi serializable sealed beforefieldinit System.DateTime 
       ¯¯¯¯ 

通常一個結構(即是一個.NET值類型不是枚舉)用C#編寫將有佈局「順序」(除非已應用StructLayoutAttribute指定另一個佈局)。

我通過一些常見的BCL程序集進行搜索,DateTimeDateTimeOffset是我在此佈局中發現的唯一公開可見的結構。

有誰知道爲什麼DateTime有這個不尋常的結構佈局?

+1

有趣的事實。有關'Auto'的文檔說*運行時自動爲非託管內存中的對象成員選擇適當的佈局。使用此枚舉成員定義的對象不能在託管代碼之外公開。試圖這樣做會產生一個異常。*也許這隻用於強制使用託管代碼。原因可能是在.NET歷史中佈局多次改變(只​​是一個假設)。更多:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.layoutkind.aspx – ZoolWay

+0

'auto'似乎沒問題,也許這個問題應該是爲什麼這麼少的其他類型使用它。 –

+0

@ZoolWay我也認爲這些線。請注意,我們仍然可以在C#中使用'DateTime *'指針類型,並使用'unsafe'上下文,例如,此程序可以正常工作:'不安全 int [] memory = {123,456,789,333,666, 999,}; fixed(int * pointer =&memory [0]) { var pointer2 =(DateTime *)pointer; Console.WriteLine(pointer2-> DayOfWeek); pointer2 + = 2; Console.WriteLine(pointer2-> DayOfWeek); } }'。 –

回答

10

這是需要猜測的,這個決定在012年之前做了一個long,遠早於.NET 1.0出貨。 System.DateTime上的屬性至多是微型優化,在.NET代碼中並不罕見。這有點合適,結構只有一個字段,所以佈局從來沒有任何問題。用於內部CustomAttribute結構的那些可能是由同一個程序員完成的。無論如何,非託管代碼都不會看到它們。

System.DateTimeOffset之一很晚了,幾乎肯定是一個複製粘貼錯誤。

程序員逃過了一劫,沒有理由讓CLR重新安排順序版本的佈局。當結構包含足夠大的字段以填充另一個小字段時,會發生重新排列自動佈局。不是DateTimeOffet的情況。

當您爲DateTimeOffset提交反饋報告時,您會得到Microsoft專家的關注。這是錯誤的。發佈到connect.microsoft.com

+0

Ineteresting。將考慮提交該錯誤報告。但結構'TimeSpan'和DateTime一樣古老,它也只有一個實例字段,那麼爲什麼這個「微優化」不適用於'TimeSpan'?你有什麼主意嗎? –

+4

TimeSpan是[ComVisible(true)],與DateTime不同。 –

+0

[提交給連接](https://connect.microsoft.com/VisualStudio/feedback/details/820333/the-struct-type-system-datetimeoffset-has-layout-auto-even-if-it-has-two -instance-字段)。 –

相關問題