【问题标题】:Usage preference between a struct and a class in D languageD语言中结构和类的使用偏好
【发布时间】:2012-06-13 12:00:51
【问题描述】:

什么时候应该将类型定义为结构或类?

我知道结构是值类型,而类是引用类型。所以我想知道,例如,我应该将堆栈定义为结构还是类?

【问题讨论】:

    标签: d


    【解决方案1】:

    原因 #1 选择结构体与类:类具有继承性,结构体没有。如果你需要多态,你必须使用类。

    原因 #2: 结构通常是值类型(尽管如果您使用它,您可以将它们设为引用类型)。类始终是引用类型。所以,如果你想要一个值类型,选择一个结构。如果你想要一个引用类型,使用类是最简单的。

    原因#3:如果您有一个包含大量数据成员的类型,那么您可能会想要一个引用类型(以避免昂贵的复制),在这种情况下,您'我可能会选择一个类。

    原因#4:如果您想要确定性销毁您的类型,那么它需要是堆栈上的结构。 GC 堆上的任何内容都没有确定性破坏,并且 GC 堆上的东西的析构函数/终结器可能永远不会运行。如果它们被 GC 收集,那么它们的终结器将被运行,否则它们不会。因此,如果您希望您的类型在离开作用域时自动销毁,您需要使用结构并将其放入堆栈。

    至于您的特定情况,容器通常应该是引用类型(每次传递一个时复制它们的所有元素会非常昂贵),而 Stack 是一个容器,所以你会想要使用一个类,除非你想把它变成一个引用计数的结构,这显然是更多的工作。它的优点是保证它的析构函数在不再使用时会运行。

    附带说明,如果您创建一个作为类的容器,您可能希望将其设置为 final,以便可以内联其各种功能(如果该类没有,则不会是虚拟的派生自 Object 以外的任何东西,它们不是 Object 拥有的函数),这对于像容器这样的性能绝对重要的东西来说可能很重要。

    【讨论】:

    • 假设容器类将所有值存储在节点类型中:如果我将其设置为结构,则每当我删除节点并且节点本身包含引用值(类的对象)时,引用也会被删除吗?示例:List!Object lisObj; ... 对象 obj = 新对象; lisObj.add(obj) lisObj.remove(Obj);//obj还会存在吗?
    • 出于好奇,Phobo 库在容器方面的完整性如何?它有什么,缺少什么?
    • 用 new 分配的任何东西都会被垃圾回收。如果您希望在特定时间释放堆上的某些内容,请使用 malloc 和 free 来管理它们的内存。至于 Phobos 的容器,它们在 std.container 中,它们目前相当稀疏,因为自定义分配器的东西仍在整理中,我们正在等待这一切完成,然后再编写所有容器,因为否则在我们添加自定义分配器时会导致重做大量工作。如果内置类型和 std.container 不够用,请看dsource.org/projects/dcollections
    【解决方案2】:

    阅读"D"iving Into the D Programming Language

    在 D 中你得到结构然后你得到类。它们共享许多便利,但有不同的章程:结构是值类型,而类则用于动态多态性,并且只能通过引用访问。这样会造成混乱、切片相关的错误和 cmets à la // 不!不要继承!不存在。当你设计一个类型时,你会预先决定它是一个单态值还是一个多态引用。众所周知,C++ 允许定义模棱两可的性别类型,但它们的使用很少、容易出错且令人反感,足以保证通过设计来避免它们。

    对于您的 Stack 类型,您最好先定义一个 interface,然后再定义其实现(使用 class),这样您就不会将您的 Stack 类型的特定实现绑定到它的界面。

    【讨论】:

    • 没有必要定义接口,因为有鸭子类型(带有编译时检查)。例如,D 范围可以在没有接口的情况下使用,并且通常实现为结构。
    • @RomanD.Boiko:你指的是模板吗?另外,interfaces 也有一定的优势。
    • 是的,受约束的模板参数。这两种方法各有优势,我只是说不必使用接口来避免耦合。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多