2009-12-29 29 views
5

根據http://msdn.microsoft.com/en-us/library/ms229017.aspx,值類型「分配在堆棧上或與其他結構內聯*」。然而在the stack is an implementation detail中,Eric Lippert表示這是一個實現細節。堆棧是實現細節,還是不是?

據我的理解,實現的細節是"a behavior produced by code which may be relied on by consuming code, though that behavior is not specified by the spec the code is written to."。我明白,文檔不是一個規範,儘管假設文檔中列出了我們可以依賴的文檔,但它不再是一個有用的細節。那麼,堆棧是一個實現細節還是不是?

*:我明白這意味着結構也可以分配在其他的內部,而不是直接堆在堆上,儘管我可能是錯的。

+0

有關的問題:http://stackoverflow.com/questions/1970894/struct-what-is-it-for/1970902#1970902 – 2009-12-29 00:47:07

+0

我剛剛標記爲複製前一段時間:) – RCIX 2009-12-29 00:51:22

回答

11

MSDN文檔告訴您有關Microsoft C#編譯器使用的特定實現struct。這些特定的細節不在ECMA 334 C#規範中;它們不是struct的語義的一部分。因此,文檔中的這些細節是實現細節。

我似乎記得在某處Eric Lippert說他希望(或者更喜歡,我不記得他提供了什麼樣的優先級)文檔沒有提及與struct有關的堆棧。我會看看我能不能挖掘它。

這是,從您鏈接到博客文章:

我遺憾的是,文件不注重什麼是最相關的;通過關注基本上不相關的實現細節,我們擴大了該實現細節的重要性,並掩蓋了使某種價值類型在語義上有用的重要性。我非常希望所有那些解釋什麼是「堆棧」的文章將花費時間來解釋究竟「按價值複製」的意思,以及誤解或誤用「按價值複製」可能導致錯誤的原因。

ECMA 334 C#規範的相關部分是§11。請注意,本節中不會使用「堆棧」一詞。該部分僅說明語法,struct遵循值語義,它們是隱式密封的並且從System.ValueType繼承,賦值給類型爲struct的變量創建副本,通過值傳遞struct作爲參數創建副本,如何將struct s設置爲默認值(將struct中的所有值類型字段設置爲其默認值,並且所有參考類型字段均設置爲null),圍繞struct的裝箱和拆箱的規則,this的含義爲struct s ,以及字段初始化,構造函數,析構函數和靜態構造函數如何爲struct工作。再一次,沒有提到堆棧。永遠。

堆棧是一個實現細節,而不是struct的語義的一部分。

1

對於C#值類型,'stack'是一個實現細節,因爲對值類型執行的每個安全操作的行爲方式都是相同的,與結構是分配在堆棧上還是堆上是正交的。 (如最終引用一個解除分配的棧幀),比如直接使用地址(例如通過傳統的API),這些操作是不安全和錯誤的使用(即不是使用Marshaling API)。