D является статически типизированным языком: начиная с момента объявления переменной, её тип не может быть изменен. Это позволяет компилятору предотвращать ошибки на раннем этапе и обеспечивать соблюдение ограничений во время компиляции. Хорошая типобезопасность обеспечивает вам необходимую поддержку, чтобы сделать большие программы более безопасными и более лёгкими в обслуживании.
В языке D есть несколько квалификаторов типа, но наиболее используемыми являются
const
и immutable
.
immutable
В дополнение к статической системе типов, D предоставляет квалификаторы типа
(иногда называемые также "конструкторы типа"), которые накладывают
дополнительные ограничения на определённые объекты. Например, immutable
объект
может быть инициализирован только один раз, после чего любые изменения
запрещены.
immutable int err = 5;
// либо: immutable arr = 5; и int будет выведен.
err = 5; // не скомпилируется
Таким образом, immutable
объекты могут быть безопасно разделены между разными
потоками без использования синхронизации, так как они по определению никогда не
меняются. Это означает, что immutable
объекты прекрасно кешируются.
const
const
объекты также не могут быть изменены. Это ограничение действительно
только для текущей области видимости. const
указатель может быть создан как из
mutable, так и из immutable
объекта. Это означает, что объект является
const
для текщей области видимости, но кто-то ещё может изменить его из
отличающегося контекста. Общепринято, что API принимают const
аргументы, чтобы
гарантировать неизменность входных данных и это позволяет одной и той же функции
обрабатывать как изменяемые, так и неизменяемые данные.
void foo ( const char[] s )
{
// если не закомментрованно, то на следующей
// строке будет ошибка (невозможно изменить костанту):
// s[0] = 'x';
import std.stdio;
writeln(s);
}
// благодаря `const`, оба вызова будут корректны:
foo("abcd"); // строка является immutable массивом
foo("abcd".dup); // .dup возвращает изменяемую копию
И immutable
и const
транзитивны, обеспечивая, что если однажды const
было применено к типу, оно рекурсивно применяется к каждому субкомпоненту этого
типа.