4

.NET の世界 (C#) から来て、C++ の基礎を学んでいます。

私が興味深いと思ったトピックの 1 つは、constキーワードとそのポインター (const ポインター/const へのポインター) での使用法でした。

C++ が持つ const ポインター/const へのポインターに相当する C# 言語があるかどうか知りたいですか? (C# にはポインターがないことはわかっています。参照は C# のポインターのような型であると考えています)。

また、興味深いことに、そのような同等のものがない場合、そのような機能を含めないことの背後にある決定は何でしたか?

4

3 に答える 3

6

C#で「const」として参照を渡すことに直接相当するものはありませんが、その目的を達成するための代替方法があります。これを行う最も一般的な方法は、参照クラスを完全に不変にするか(一度構築すると、その状態は決して変更されない)、または不変のパブリックインターフェイスとして渡すことです。後者は、「const」パラメーターコントラクトの意図に最も近いものです(使用できるように参照を提供していますが、変更しないようにお願いしています)。もちろん、パブリックインターフェイスを変更可能な形式にキャストしますが、それでも意図は明確になります。C ++でconstを「キャストアウェイ」することもできますが、これはめったに良い考えではないと思いました。


C ++のもう1つの点は、渡す参照の存続期間の範囲が制限されていることを知っている場合は、constとして渡すことを好むことが多いということです。C ++は、メソッドスコープ内のスタックでオブジェクトが作成および破棄されるパターンに従うことが多いため、これらのオブジェクトへの参照は、そのスコープ外で永続化しないでください(スコープ外にあるオブジェクトを使用すると、非常に厄介なスタック破損がクラッシュする可能性があるため)。 const参照は変更しないでください。したがって、後で参照するためにconst参照をどこかに格納することは悪い考えであるという強いヒントです。constパラメーターを使用するメソッドは、これらのスコープ参照を安全に渡すことができることを約束しています。C#では、オブジェクトへの参照を(パラメーターの外で)スタックに格納することはできないため、これはそれほど問題にはなりません。

于 2012-12-24T20:29:02.943 に答える
2

readonlyC#(またはJava)の定数オブジェクト(つまり)の概念はobject *const、C ++の定数オブジェクト、つまり非定数オブジェクトへの定数ポインターにほぼ対応しています。

それにはいくつかの理由がありますconst。正しく指定して言語で役立つようにするのは非常に難しいからです。c ++を例にとると、署名にわずかな変更を加えるだけで、多くのメソッドを2回定義する必要があります。const_cast、constが浅くのみ適用されるという事実などがあります。

そこで、C#は、言語を単純化するための簡単な解決策をD選びました。私が理解しているように、推移的な定数の正確さなどを逆に使用しました(Dで1行も記述したことがないので、一粒の塩でそれを取ります)。

C#/ Javaの通常の解決策は、おそらくビルダーパターンを使用する不変のクラス、または変更を禁止する単純なラッパー(たとえば、別のコレクションをラップし、addなどの変更メソッドの例外をスローするすべての変更不可能なコレクション)を使用することです。

于 2012-12-24T20:28:11.627 に答える