人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C#にはなぜconstが無いのか?
今更ですがC#を勉強中のC++プログラマーです。
C#にはC++の機能を受け継いだものも少なくないですが、なぜC++のようなconstの機能は受け継がれなかったのでしょうか?
(C#にもconstキーワード自体はあるが機能はかなり限定されている)
特に関数の入力パラメーターには必ずconstを付けるC++プログラマーにとって、constがないと不安になります。
# 実はあまり役立っていなかったのか、使いこなせない人が多かったのか…

●質問者: ガー!
●カテゴリ:コンピュータ 学習・教育
✍キーワード:C# C++ const キーワード パラメータ
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● a-kuma3

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++ だったらなぁ...」とつぶやいてます。

◎質問者からの返答

C# が java の対抗馬だから

それじゃあ、「Javaにはなぜconstが無いのか?」に変わるだけの気が。


2 ● a-kuma3

それじゃあ、「Javaにはなぜconstが無いのか?」に変わるだけの気が。

ごめんなさい、脳内では回答してたんですが、回答に書いてませんでした (^^;


もともと、java って、c++ へのアンチテーゼとして設計されているじゃないですか。

例えば、それぞれが独立してるわけじゃないですけど、

などなど。


ポインタや、多重継承、テンプレート、スタックからのメモリ割り当て、プリプロセッサ、ヘッダファイル(宣言と実装の分離)などが、

ばっさり切り捨てられる中に、const も含まれてた、と。

引数だけに限らず、変数宣言での const も、volatile と合わせて、コンパイラの最適化にとって、

重要だと思いますが、「シンプル」の犠牲になってます。


--

(追記)

何か読み物が無いとつまんないですね。

いくつか、関係するところをみつくろいました。

Java#思想 @Wiki

JavaとC++の比較#設計思想 @Wiki

Write once, run anywhere @Wiki


--

(追記)

また、脳内で完了してた。

テンプレートは、ジェネリック型として採用された、ということあるので、

const の一部 (できれば、メソッドの const 修飾) が採用されるかもしれません。


# Oracle 買収前だったらね

◎質問者からの返答

「JavaとC++の比較 - 文法」で若干constに触れていますが、ズバリの解説はなさそうですね。

「シンプル」にするため、

ので削ったんですかね。


3 ● fenstrial

Anders Hejlsberg(C#設計者)が以下の記事のImmutablesで述べています。

適当に抜粋、翻訳すると、

ミューテーションは、効率化のためキャッシュを持つことを必ずしも否定しない。外部から見た振る舞いが同じであることがミューテーションだ。イミュータブルは便利だが、それは作者がそう言っておけばよい

と言っています。


以下、自分の文章

引数やmethodにconstがあると後からキャッシュを持たせて、効率化をはかるといったことができないといったことが理由のようです。特別に必要ならstringのように変更があるときは新しいオブジェクトを返すなどのようにして実現するようにということなのでしょう。


http://www.artima.com/intv/choicesP.html

◎質問者からの返答

Immutablesの節を読んでみましたが、fenstrialさんとは異なる解釈になりました。(?_?;


コンパイラーで不変性を扱うのは難しいので、取り入れなかった。イミュータブルオブジェクトは便利だが、作者が不変だというだけで良いじゃないか。


C++のconstの意義を否定している感じ。


4 ● じゅぴたー

質問者への逆質問で申し訳ありませんが、constreadonlyではいけないのでしょうか?

◎質問者からの返答

質問文にも書いたように機能が足らないと思っていますが、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
}
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ