Typqualifizierer

D besitzt eine statische Typisierung. Wenn eine Variable deklariert wurde, kann der Typ nicht mehr verändert werden. Dies erlaubt dem Kompiler viele Fehler früh zu erkennen und Restriktionen können schon während der Kompilierung erkannt werden. Ein gutes Typsystem leistet die benötigte Unterstützung für die Sicherheit und bessere Wartbarkeit großer Programme.

D stellt verschiedene Typqualifizierer zur Verfügung aber die meist Genutzten sind const und immutable.

immutable

Zusätzlich zu der statischen Typisierung, stellt D Typqualifizierer (auch "Speicherklassen" genannt) bereit welche weitere Beschränkungen erlauben. Zum Beispiel kann ein immutable (unveränderbares) Objekt nur einmal initialisiert werden und kann danach nicht mehr verändert werden.

immutable int err = 5;
// oder: immutable arr = 5 (der Typ int wird automatisch inferriert)
err = 5; // FEHLER

Wegen ihrer Unveränderbarkeit, können immutable Objekte sicher und ohne Syn­chro­ni­sa­ti­on zwischen Threads geteilt werden. Dies impliziert auch, dass immutable Objekte perfekt gecacht werden können.

const

const Objekte können ebenfalls nicht verändert werden. Diese Restriktion ist jedoch nur für den aktuellen Geltungsbereich gültig. Ein const Zeiger kann sowohl von einem unveränderbaren (immutable) Objekt als auch von einem veränderbaren Objekt erzeugt werden. Das bedeutet, dass die Restriktion nur für den aktuellen Bereich gilt und in einem anderen Kontext verändert werden kann. Nur durch immutable ist garantiert, dass der Wert sich niemals ändern kann. Es ist typisch für APIs const Argumente zu akzeptieren, da so garantiert wird, dass keine Modifikation stattfindet. Zusätzlich kann die Funktion hierdurch veränderbare und nicht veränderbare Argumente verarbeiten.

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 array
foo("abcd".dup); // .dup returns a mutable copy

Sowohl immutable als auch const sind transitiv. Dies gewährleistet, dass sobald ein Typ const ist alle Subkomponenten dieses Types ebenfalls const sind.

In der Tiefe

Grundlegende Referenzen

Weiterführende Referenzen

rdmd playground.d