class - 在类和结构之间选择

标签 class polymorphism d struct

关于C#的msdn文章Choosing Between Classes and Structures提供了以下建议:

Consider defining a structure instead of a class if instances of the type are small and commonly short-lived or are commonly embedded in other objects.

Do not define a structure unless the type has all of the following characteristics:

It logically represents a single value, similar to primitive types

(integer, double, and so on).

It has an instance size smaller than 16 bytes.

It is immutable.

It will not have to be boxed frequently. 

If one or more of these conditions are not met, create a reference type instead of a structure. Failure to adhere to this guideline can negatively impact performance.



我不知道在D情况下会得到什么答案。到目前为止,在所有不需要多态的情况下,我都只是简单地使用了结构。我不知道尺寸是否也要考虑。或其他任何东西。

最佳答案

我要说的是,该建议绝对不适用于D。

结构是值类型。类是引用类型。结构通常在堆栈上(尽管它们可以在堆上并用指针指向)。类在堆上。结构没有继承或多态性。类具有继承性和多态性。

在D中使用结构是非常普遍的。我认为一般规则是,如果某些东西不需要具有多态性,则应该将其作为结构。在结构上选择类的主要原因是因为您想要继承和多态性。

第二个原因是,将类型作为引用类型是否更有意义(例如,容器可能应该是一个类,因为每次将其传递给函数时都将其复制是不好的)。结构可以具有引用语义,但是使用类对此更干净。

最后,如果一个类型中包含大量数据,并且每次将其传递给函数时都不需要它的副本,那么将其设为一个类并仅当您将其复制时会更有效。实际需要(尽管您可以选择始终始终通过ref传递它)。

D的结构绝对比C#的结构更奇特,因为它们具有析构函数和postblit constructors。 D中也没有自动装箱问题,因为D使用的是模板(类似于C++,尽管功能更强大且更易于使用),而不是泛型。而且,如果您需要指向结构的指针,这很容易做到。因此,我真的不认为C#的建议适用于D。

在我看来,C#建议源于两个问题:

  • 结构是值类型,因此具有值语义。
  • C#中的结构必须处理自动装箱这一事实,并且必须非常担心复制的成本。

  • 结构也是D中的值类型,但是它们足够强大,可以在需要时具有引用语义,并且添加了postblit构造函数和析构函数使它们比在C#中对结构所做的更多有用。而且由于D没有自动装箱,因此关于自动装箱的问题也不适用于D。您仍然不希望您的结构庞大,因为除非您通过ref,否则只要您通过ref,它们都将被复制。函数,但这绝对不是C#中的大问题。在这方面,它更符合C++。

    关于不变性的建议根本不适用于D。D结构经常是易变的,如果不是,这将是一个大问题。例如,范围通常被实现为结构体,如果您无法对其进行突变,那将是不可能的。

    因此,不,我认为C#建议确实不适用于D。两种语言之间的情况差别太大。最好将D的结构视为C++类,因为C++类没有任何基类并且不能从中派生,因为与C#的结构相比,它们实际上更接近于它们的实际含义。

    关于class - 在类和结构之间选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6884871/

    相关文章:

    c++ - 对象切片如何导致内存损坏?

    iphone - 这是为 iPhone 应用程序创建和调用类的正确方法吗?

    python - 如何在类中使用 pyglet

    class - 删除类后出现 VB6 错误 "No creatable public component detected"

    java - Java 中的多态复制

    c++ - 具有新数据成员的多态性

    d - 如何在 Vibe.D 中迭代 JSON 数组?

    java - 有没有办法确定类在 Java 中是什么类型的实例?

    c# - 在一个查询中获取基类和继承类的文档

    graph - D语言中的并行迭代器