今更ですがC#を勉強中のC++プログラマーです。
C#にはC++の機能を受け継いだものも少なくないですが、なぜC++のようなconstの機能は受け継がれなかったのでしょうか?
(C#にもconstキーワード自体はあるが機能はかなり限定されている)
特に関数の入力パラメーターには必ずconstを付けるC++プログラマーにとって、constがないと不安になります。
# 実はあまり役立っていなかったのか、使いこなせない人が多かったのか…
C# が java の対抗馬だから、でしょう、きっと。
.NET 自体が、java が持ってる領域を狙ってて、間口を広げるために CLI を使える言語を
いろいろ取り揃えてて、その中で言語としての java を狙ってるのが C# 。
だから、java が切り捨てたものは、C# には無いんです。
.NET で、c++ をやりたい人は、C++/CLI を使ってね、ということなんでしょう。
一応、J# もありますが、C# は、従来 MFC を使ってた人たちを引き込みたいんでしょう。
特に関数の入力パラメーターには必ずconstを付けるC++プログラマーにとって、constがないと不安になります。
これもそうですし、メソッドの const 修飾が無いのも痛いです。
C# の const は、java の final ですもんね。
ぼくも、c++ 歴は、それなりにあるクチなんですが、引数の中身変わってたー、とか、
他のメンバーの値を書き換えてたー、みたいな障害を見るたびに、
「c++ だったらなぁ...」とつぶやいてます。
それじゃあ、「Javaにはなぜconstが無いのか?」に変わるだけの気が。
ごめんなさい、脳内では回答してたんですが、回答に書いてませんでした (^^;
もともと、java って、c++ へのアンチテーゼとして設計されているじゃないですか。
例えば、それぞれが独立してるわけじゃないですけど、
などなど。
ポインタや、多重継承、テンプレート、スタックからのメモリ割り当て、プリプロセッサ、ヘッダファイル(宣言と実装の分離)などが、
ばっさり切り捨てられる中に、const も含まれてた、と。
引数だけに限らず、変数宣言での const も、volatile と合わせて、コンパイラの最適化にとって、
重要だと思いますが、「シンプル」の犠牲になってます。
--
(追記)
何か読み物が無いとつまんないですね。
いくつか、関係するところをみつくろいました。
Write once, run anywhere @Wiki
--
(追記)
また、脳内で完了してた。
テンプレートは、ジェネリック型として採用された、ということあるので、
const の一部 (できれば、メソッドの const 修飾) が採用されるかもしれません。
# Oracle 買収前だったらね
Anders Hejlsberg(C#設計者)が以下の記事のImmutablesで述べています。
適当に抜粋、翻訳すると、
ミューテーションは、効率化のためキャッシュを持つことを必ずしも否定しない。外部から見た振る舞いが同じであることがミューテーションだ。イミュータブルは便利だが、それは作者がそう言っておけばよい
と言っています。
以下、自分の文章
引数やmethodにconstがあると後からキャッシュを持たせて、効率化をはかるといったことができないといったことが理由のようです。特別に必要ならstringのように変更があるときは新しいオブジェクトを返すなどのようにして実現するようにということなのでしょう。
Immutablesの節を読んでみましたが、fenstrialさんとは異なる解釈になりました。(?_?;
コンパイラーで不変性を扱うのは難しいので、取り入れなかった。イミュータブルオブジェクトは便利だが、作者が不変だというだけで良いじゃないか。
C++のconstの意義を否定している感じ。
質問文にも書いたように機能が足らないと思っていますが、C#で以下のようなことはできますか?
class Foo { int m_data; public: void func1() const { m_data = 1; // コンパイルエラー } void func2() { m_data = 1; // OK } }; void func1(const Foo &foo) { foo.func1(); // OK foo.func2(); // コンパイルエラー } void func2(Foo &foo) { foo.func1(); // OK foo.func2(); // OK } int main() { const Foo foo1; func1(foo1); // OK func2(foo1); // コンパイルエラー Foo foo2; func1(foo2); // OK func2(foo2); // OK }
それじゃあ、「Javaにはなぜconstが無いのか?」に変わるだけの気が。