我會說,這個建議肯定不會不適用於D.
結構是值類型。類是引用類型。結構通常在堆棧上(儘管它們可以在堆上,並用指針指向)。類在堆上。結構沒有繼承或多態性。類具有繼承性和多態性。
這是非常在D中使用結構是很常見的。我認爲一般規則是,如果某些東西不需要有多態性,它應該是一個結構。 主要原因在結構上選擇一個類的原因是因爲你想要繼承和多態。
第二個原因是,如果它只是更有意義的類型是一個引用類型(例如一個容器應該可能是一個類,因爲每次你將它傳遞給一個函數時複製它不會很好)。結構可以有引用語義,但它只是使用類更清潔。最後,如果一個類型中包含大量數據,並且只要將它傳遞給一個函數就不需要它的副本,那麼使它成爲一個類並且只有它是更有效的當你真的需要時複製它(儘管你可以選擇總是通過ref來代替它)。
D的結構比C#的結構更加奇特,因爲它們具有析構函數和postblit constructors。 D中也沒有自動裝箱問題,因爲D使用模板(類似於C++,儘管功能更強大,使用也更容易),而不是泛型。如果你需要一個指向結構的指針,很容易做到。所以,我真的不認爲對於C#的建議適用於D.
在我看來,在C#建議從兩個問題源於:
- 該結構是值類型,因此有事實價值語義。
- C#中的結構必須處理自動裝箱並且必須非常擔心複製的成本。
結構是也是d值類型,但他們足夠強大,能夠有引用語義,如果你想,並增設postblit構造函數和析構函數,使他們遠比更有用什麼你可以用C#中的結構來完成。而且由於D沒有自動裝箱,所以對自動裝箱的擔心不適用於D.你仍然不希望你的結構變得龐大,因爲除非你通過ref,否則當它們通過時它們會被複制到一個函數,但它絕對不像在C#中那麼大。在這方面它更符合C++。
而關於不變性的建議不適用於在所有到D. D結構經常是可變的,如果它們不是,它將是一個大問題。例如,範圍通常是作爲結構實現的,如果你不能改變它們,這是不可能的。
所以,不,我不認爲C#的建議真的適用於D.這兩種語言之間的情況完全不同。將D的結構看作沒有任何基類並且不能派生的C++類會更好,因爲它比C#的結構更接近實際的結果。
你說的是編程語言D嗎?如果是這樣,你正在談論的是與C#完全不同的語言 - 開始嘗試將來自一種語言和平臺的推薦應用到另一種語言是一個非常糟糕的主意。 –
@John Skeet--這不就是他問這個問題的原因。他閱讀了關於適用於C#的東西,並詢問D的情況是怎樣的。 – iandotkelly
@Jon Skeet。是的,我正在談論D.對於混淆抱歉。我意識到,語言是不同的,這只是讓我想知道。 – fwend