我会说,这个建议肯定不会不适用于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