回答
原因#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 –