何时以及如何在D中使用`const`和`immutable`?

Ral*_*zky 5 d const-correctness immutability

在许多现代语言中,const应该使用正确性来阐明接口和意图,并为编译器提供一些优化的机会.在D中,存在真正不可变数据的很酷的特征.应该如何constimmutable使用?我有点想,更喜欢const作为函数参数和immutable局部变量的限定符似乎是编写代码的好方法,但是只要你想要一个带有引用或指针的结构,如数据成员(私有或非私有),不可变的变量,你不能这样做.

struct S {
    private int[] data;
}

void main() {
    immutable s = new S; // won't work, since members aren't immutable
}
Run Code Online (Sandbox Code Playgroud)

因此,struct如果我使用不可变的话,更改a的实现会破坏我的代码.我是否更喜欢const局部变量并仅在必要时使用不可变?指导方针是什么?

Mih*_*uns 6

你非常幸运 - 上周发布了DConf2013的视频,该视频专门针对这个主题发表了演讲:http://youtu.be/mPr2UspS0fE

在你的情况下,auto s = new immutable(S)();应该做的伎俩.然后,您可以在构造函数中创建数据切片点.但是,如果此片可能指向任何数据,则S不可能是一成不变的,因为两者constimmutable在d传递-它们提供了非常有力保障不仅是变量本身,而且还对可以从中间接访问的任何数据通过引用/指针.

它实际上包含在链接视频中,但简短的总结是你想要在真正打算使用不可变时.换句话说,当您希望代码在S实现发生更改时中断,以便不可变保证不再有效.