D 是静态类型的语言:变量在声明之后,类型就不能再发生变化。这样能让编译器尽早发现错误,并且在编译时强制进行限制。良好的类型安全性使得大型项目更容易维护。
D 中拥有很多类型限定符,但是最常用的还是 const
和 immutable
。
immutable
除了静态的类型系统,D 还提供了类型限定符(有时也成为“type constructors 类型构造函数”),它们允许对某些变量附加约束。例如,immutable
的变量只能够被初始化一次,之后不允许再修改:
immutable int err = 5;
// 或者: immutable err = 5 ,err 的类型 int 会被自动推断出来
err = 5; // 编译错误
因此,immutable
的对象能够在不进行同步操作的情况下安全的共享,因为它们从不会被修改,这也意味着 immutable
能够被完美的缓存。
const
const
变量也不能够被修改,但是这个限制只适用于当前作用域。一个 const
指针能够指向 immutable
或者 mutable
的对象,这意味着改对象不会在当前作用于内被修改,但其他人可能在上下文中修改它。
API 常常接受 const
参数,以确保它们不修改输入的对象。这样他就允许用相同的方式处理可变或者不可变的数据。
void foo(const char[] s)
{
// 如果没有注释下面这一行,那么它就会
// 导致编译时错误(不能修改 const 变量)
// s[0] = 'x';
import std.stdio : writeln;
writeln(s);
}
// 因为 foo 接受的参数是 const 的,所以下面两行都能通过编译
foo("abcd"); // 字符串是不可变的数组
foo("abcd".dup); // .dup 返回数组的一个可变拷贝
immutable
和 const
都是可传递的类型限定符,这确保了一旦 immutable
或者 const
被施加到一个类型上,那么它的所有子成员都将不可变。