D is a statically typed language: once a variable has been declared,its type can't be changed from that point onwards. This allowsthe compiler to prevent bugs early and enforce restrictionsat compile time. Good type-safety provides the support one needsto make large programs safer and more maintainable.
There are several type qualifiers in D but the most commonly used ones areconst andimmutable.
immutableIn addition to a static type system, D provides type qualifiers (sometimes alsocalled "type constructors") that enforce additional constraints on certainobjects. For example animmutable object can only be initialized once andafter that isn't allowed to change.
immutable int err = 5;// or: immutable err = 5 and int is inferred.err = 5; // won't compileimmutable objects can thus be safely shared among different threads with nosynchronization, because they never change by definition. This also implies thatimmutable objects can be cached perfectly.
constObjects can't be modified through a const reference.A mutable reference to the same object can still modify it.Aconst pointer can be created from either amutable orimmutable object. It is commonfor APIs to acceptconst arguments to ensure they don't modify the input asthat allows the same function to process both mutable and immutable data.
void foo(const char[] s){ // if not commented out, next line will // result in error (can't modify const): // s[0] = 'x'; import std.stdio : writeln; writeln(s);}// thanks to `const`, both calls will compile:foo("abcd"); // string is an immutable arrayfoo("abcd".dup); // .dup returns a mutable copyBothimmutable andconst aretransitive type qualifiers, which ensures that onceconst is applied to a type, it applies recursively to every sub-component of that type.
immutable int* p = new int;p = null; // error*p = 5; // errorThe element type of a pointer (or array) can be qualified separately:
immutable p = new int; // immutable(int*)immutable(int)* q = p; // OK, mutable pointerq = null; // OK*q = 5; // errorThestring type is defined asimmutable(char)[]:
string s = "hi";s ~= " world"; // OK, append new characterss[0] = 'c'; // error, can't change existing data