回答
原因#1選擇struct vs class:類有繼承,結構不。如果你需要多態,你必須使用類。
原因#2:結構通常是值類型(儘管如果您在其中工作,可以使它們成爲引用類型)。類總是引用類型。所以,如果你想要一個值類型,選擇一個結構。如果你想要一個參考類型,最簡單的方法就是上課。
理由3:如果你有大量的數據成員的類型,那麼你可能會想引用類型(以避免昂貴的複製),在這種情況下,你可能會選擇一個班級。
原因#4:如果你想確定性地破壞你的類型,那麼它將需要一個堆棧結構。 GC堆上沒有確定性的破壞,GC堆上的破壞者/終結器可能永遠不會運行。如果他們被GC收集,那麼他們的終結者將被運行,但否則,他們不會。所以,如果你希望你的類型在它離開作用域時被自動銷燬,你需要使用一個結構體並將它放在堆棧中。
至於你的具體情況,容器通常應該是參考類型(複製所有元素,每次你通過一個將會非常昂貴),並且是一個容器,所以你會想要使用一個類,除非你想要使它成爲ref-counting結構的麻煩,這肯定是更多的工作。它的優勢在於保證析構函數在不再使用時運行。
另一方面,如果你創建一個容器是一個類,你可能會想要使它成爲最終的,這樣它的各種函數就可以被內聯了(如果該類不會被虛擬化, t衍生自Object
以外的任何東西,它們不是Object
所具有的功能),這對於性能絕對重要的容器可能很重要。
讀"D"iving Into the D Programming Language
在d你結構,然後你得到的類。他們共享許多設施,但有不同的章程:結構是價值類型,而類是爲動態多態而設計的,並且只能通過引用來訪問。這種混淆,切片相關的錯誤,和評論拉//否!不要繼承!不存在。當你設計一個類型時,你會預先決定它是一個單態值還是多態參考。 C++着名允許定義含糊不清的性別類型,但它們的使用是罕見的,容易出錯的,並且令人反感,足以保證通過設計避免它們。
爲了您Stack
類型,你可能是最好的方法是定義其interface
先實現(使用class
),這樣就不會搭配特定的實現你的Stack
類型的接口。
定義一個接口不是必需的,因爲有鴨子打字(帶編譯時檢查)。例如,D範圍可以在沒有接口的情況下使用,並且通常以結構體的形式實現。 –
@ RomanD.Boiko:你是指模板嗎?另外,'interface's有一定的優勢。 – dirkgently
是,約束模板參數。這兩種方法都有其優點,我只是說,使用接口不是必要的,以避免耦合。 –
- 1. 在系統偏好設置 - >語言和文字中獲得語言偏好
- 2. 更新結構 - d編程語言
- 3. d - 純類和結構
- 4. 類之間的共享偏好(靜態)?
- 5. 活動和服務之間的偏好
- 6. Django:錯誤的語言偏好
- 7. 用D語言測量執行時間
- 8. 結構和類之間的區別?
- 9. 使用片段和活動之間的共享偏好
- 10. D語言中的析因
- 11. 不同語言間的服務器客戶端偏好
- 12. Android更新語言偏好活動
- 13. 馴服MS Word語言偏好
- 14. D語言的語言自省
- 15. c語言:在實現使用結構
- 16. 在URL中強制用戶的語言偏好 - 重寫?
- 17. struct to ubyte []或ubyte []結構爲d語言
- 18. 強類型和弱類型語言之間測試的差異
- 19. 「d = dict()」和「d = {}」之間的區別
- 20. 突然間,CultureInfo.CurrentUICulture不反映IE9語言偏好?
- 21. Django的多語言和模板端語言之間的切換
- 22. Xcode偏好設置,行爲部分,「使用」語言說通告?
- 23. d語言線程
- 24. 語言和框架之間的區別
- 25. Automapper屬性偏好的層次結構
- 26. django-多語言和模板端語言之間的切換
- 27. E語言支持D語言
- 28. 使用通用中間語言的好處是什麼?
- 29. 如何在Yii2中根據用戶偏好更改語言?
- 30. 結構數據d = {0}和結構數據d = {}
假設容器類可以存儲節點類型中的所有值:如果將其設置爲結構,則每當刪除節點並且節點本身包含引用值(類的對象)時,該引用是否也會被刪除? 例: List!Object lisObj; ... Object obj = new Object; lisObj.add(obj) lisObj.remove(Obj); //將obj仍然存在? – Fred
只是爲了好奇,關於容器的福博圖書館有多完整?它有什麼和缺少什麼? – Fred
任何與new分配的東西都是垃圾回收。如果你想在堆上的東西在特定的時間被釋放,那麼使用malloc和free來管理它們的內存。至於Phobos的容器,它們在std.container中,而且它們目前相當稀少,因爲自定義分配器的東西仍然在被排除,我們正在等待在寫入所有容器之前完成這些工作,因爲否則在我們添加自定義分配器時會導致重做很多工作。如果內置類型和std.container不夠用,請查看http://www.dsource.org/projects/dcollections –