C#

C#が意図的に入れてないもの。

const(C++)、宣言的例外処理(java)、非ヌル型(?)、契約によるデザイン(D)

静的型言語のいいところは実行前にミスが洗いだせることだ。エクストリームプログラミングをあみだしたSmalltalker達は、テストファースト、プログラムを書く前に自分の書いたプログラムが正しく動くかチェックするコードを書け、という不可能に近い難題をだした。実際は現実時間で書ける範囲ではそんなの書いてもバグなんかとれないのだが、動的型言語ではバグ以前のスペルミスみたいなのがチェックされないため、そういったものをなくすためにはなくてはならないものだった。

そんなミスはコンパイルすればいいだけだ。スモールトーク信者のソフトウェア開発コンサルタント(この職業は意味あい的に言えば詐欺師に限りなく近い)達は、自分達の発見したこの方法論を流行り言語であるjavaでも適用して一儲けしようとしたがうまくいかなかった。javaではコンパイルすればいいだけの話だったから。

コンパイル時のチェックを厳密化するために、コンパイルに必要のない情報まで制限する。private、なんかが代表的だ。入力と出力を決めて、それ以外を隠す。これは非常にうまくいった。オブジェクト指向になくてはならない機能になった。

しかしプライベートと書くたびに拡張性が犠牲になる。クラスの使い方を学習するものにとってはプライベートは限りなく有効に機能するが、既に分かっている人間にはほとんど意味がない機能だ。それに言語で強制しなくても、命名規則でこの名前のものにアクセスしちゃいけない、とするだけでも別に十分だ。

コンパイルに必要のない能力まで制限することで言語の自由度が下がる。自由と厳密さをどこでバランスさせるか。例外というのは間違いが起こった瞬間を全て記録しビジュアルデバッガで丸見えにするための機能でありキャッチすることそのものが誤りなので宣言的例外処理はないほうがいい。constは学習者に分かりやすさを提供しないのでいらない。契約によるデザインはテストコードがいらないのと同じ理由でいらない。