2012-02-08 20 views
1

我認爲LayoutKind.Sequential和LayoutKind.Explicit是清晰的,但是如何由C#處理LayoutKind.Auto?StructLayout.Auto與sequ​​ential和Explicit相比,意味着什麼?

+1

什麼在[documentation](http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.layoutkind.aspx)你不明白? – Oded 2012-02-08 15:38:35

+0

@Oded文檔沒有詳細說明「Auto」如何工作的內部工作方式,我認爲這是OP的主要內容。我不認爲這個問題值得它得到的降價。 – 2012-02-08 15:46:48

+0

@JohnFeminella - 問題是因爲它不清楚而陷入低估。 OP沒有具體說明他不明白的地方 - 你的猜測和任何一樣。 – Oded 2012-02-08 15:47:57

回答

1

documentation似乎非常清楚:

運行時會自動選擇合適的佈局在非託管內存對象的 成員。使用此 枚舉成員定義的對象不能在託管代碼之外公開。 試圖這樣做會產生一個異常。

換句話說,佈局是動態的,意味着您的對象不能再在託管代碼之外使用。

1

女士說here

公共語言運行時默認使用的自動佈局值。到 減少與自動值相關的佈局相關問題,C#, Visual Basic和C++編譯器指定值爲 類型的順序佈局。

4

LayoutKind.Auto只是意味着,「我給予CLR許可重新排序對應於這些字段的字節」。它決定如何重組內存使用,打包等領域。 它會做出的變化並不是由文檔指定的,可能是因爲它的實現細節與您編寫結構的方式無關。

如果您傳遞給非託管代碼,這總是一件壞事,因爲非託管代碼期望這些字段處於特定順序。他們可能的重組肯定會產生意想不到的後果。這就是爲什麼你不能將LayoutKind.Auto結構暴露給非託管代碼。