W zamian wprowadzono wiele nowoczesnych rozwiązań: programowanie kontraktowe, prawdziwe moduły, wbudowane automatyczne zarządzanie pamięcią (przez garbage collector), testy jednostkowe, tablice asocjacyjne, tablice dynamiczne, domknięcia, funkcje anonimowe, funkcje zagnieżdżone, klasy wewnętrzne, leniwe wartościowanie oraz zintegrowany z kompilatorem system dokumentacji ddoc. Oprócz tego całkowicie przeprojektowano mechanizm szablonów. Utrzymana została możliwość tworzenia niskopoziomowego kodu oraz umieszczania wstawek asemblerowych.
Paradygmaty programowania D wspiera trzy główne paradygmaty programowania: imperatywne, obiektowe oraz generyczne.
Programowanie imperatywne Programowanie imperatywne wygląda niemal identycznie, jak w C. Dostępne są klasyczne pętle, instrukcje warunkowe, funkcje, zmienne lokalne i globalne oraz wyrażenia, które działają identycznie, jak w pierwowzorze, a programy mają bezpośredni dostęp do biblioteki standardowej C. Ponadto wprowadzone zostały dwa rozszerzenia w postaci instrukcji foreach do iterowania po kolekcjach oraz funkcji zagnieżdżonych, które mają dostęp do zmiennych lokalnych funkcji nadrzędnej.