14

C#での参照は、ガベージコレクションである点を除いて、C++での参照と非常によく似ています。

それでは、C#コンパイラが以下をサポートするのが非常に難しいのはなぜですか。

  1. とマークされたメンバー関数const
  2. マークされたデータ型(文字列以外)への参照const。これを介してconstメンバー関数のみを呼び出すことができますか?

C#がこれをサポートしていれば本当に便利だと思います。一つには、それは、C#プログラマーがプライベートデータへの裸の参照を返す、一見広まっているゲイの放棄を本当に助けます(少なくともそれは私の職場で見たものです)。

または、私が見逃しているC#に相当するものがすでにありますか?readonly(とキーワードについては知ってconstいますが、実際には上記の目的には役立ちません)

4

5 に答える 5

17

いくつかの実際的な理由と、いくつかの理論的な理由があると思います。

  • constness をオブジェクトまたは参照に適用する必要がありますか? それが参照にある場合、これはコンパイル時のみであるべきですか、それとも参照自体の中に少しあるべきですか? 同じオブジェクトへの非 const 参照を持つ他の何かが、フードの下でそれをいじることはできますか?
  • C++ でできるように、それをキャストできるようにしたいですか? これはマネージド プラットフォームで必要なこととはあまり思えませんが、C++ でそれが理にかなっている場合はどうでしょうか。
  • 宣言に複数の型が含まれていると、構文が複雑になります (IMO)。配列、ジェネリックなどを考えてください。どのビットが const であるかを正確に判断するのが難しくなる可能性があります。
  • あなたがそれを捨てることができないなら、誰もがそれを正しくしなければなりません. つまり、使用する .NET フレームワーク タイプとその他のサード パーティ製ライブラリの両方がすべて正しいことを行う必要があります。一貫性。

ただし、現在サポートされていない理由に関しては、大きな理由があります。

  • 下位互換性: すべてのライブラリを正しく移行する方法はなく、ほとんど役に立たない :(

ある種のコンスタント インジケーターがあれば便利だということには同意しますが、残念ながら、それが起こっているのを見ることができません。

編集: Java コミュニティでは、この怒りについて何年にもわたって議論がありました。関連するバグについては、興味深いと思われる多くの解説があります。

于 2009-02-09T13:41:20.287 に答える
6

Jon が既に説明したように (もちろん)、const の正確性は見た目ほど単純ではありません。C++ は 1 つの方法でそれを行います。Dは別の(おそらくより正確で便利な)方法でそれを行います。あなたが発見したように、C#はそれをいじりますが、それ以上大胆なことはしません(Jonが再びよくカバーしたように、決してうまくいかない可能性があります).

そうは言っても、Jon の「理論的理由」の多くは D のモデルで解決されていると思います。

D (2.0) では、const は C++ とほぼ同じように機能しますが、完全に推移的であることを除いて (したがって、ポインターに適用された const は、指されたオブジェクト、そのオブジェクトのメンバー、オブジェクトが持っていたポインター、それらが指していたオブジェクトなどに適用されます) ) - ただし、これがconst を宣言した変数からのみ適用されることは明らかです (したがって、既に非 const オブジェクトがあり、それへの const ポインターを取得する場合、非 const 変数は状態を変更できます)。

D では、オブジェクト自体に適用される別のキーワード invariant が導入されています。これは、一度初期化されると状態を変更できないことを意味します。

この配置の優れた点は、const メソッドが const オブジェクトと不変オブジェクトの両方を受け入れることができることです。不変オブジェクトは機能的な世界のパンとバターであ​​るため、 const メソッドは機能的な意味で「純粋」とマークすることができます - 可変オブジェクトで使用することはできますが。

軌道に戻る - const (および不変式) の最適な使用方法を理解しているのは、今 (いたずらの後半) だけだと思います。.Net は元々、物事がより曖昧だったときに定義されたため、あまりコミットしませんでした。

D のポートが .Net VM で動作するのを見たいのですが:-)

于 2009-02-09T15:02:21.030 に答える
5

C# 言語の設計者であるHeljsberg 氏は、この質問に既に回答しています。

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

于 2009-02-09T15:05:45.933 に答える
2

C# の将来のバージョンに不変型が追加されたとしても、私は驚かないでしょう。C# 3.0 では、すでにその方向への動きが見られます。

たとえば、匿名型は不変です。

並列処理を受け入れるように設計された拡張機能の結果として、不変性がますます出現する可能性が高いと思います。

于 2009-02-12T11:08:39.277 に答える
0

問題は、C# で constness が必要かどうかです。

  1. JITter は、指定されたメソッドがオブジェクト自体に影響を与えず、対応する最適化を自動的に実行することを知っていると確信しています。call(おそらく代わりに放出することによってcallvirt?)

  2. constness の長所のほとんどはパフォーマンスに関連しているため、それらが必要かどうかはわかりません。ポイント 1 に行き着きます。

それ以外にも、C# にはreadonlyキーワードがあります。

于 2009-02-09T13:40:06.607 に答える