C#で複合代入演算子をオーバーロードできないのはなぜですか?


11

タイトルは誤解を招く可能性があるため、質問全体をお読みください:-)

「複合代入演算子」によってop=、たとえばこのような構造を念頭に置いてい+=ます。純粋な代入演算子(=)は私の質問に属していません。

「理由」とは、意見ではなく、デザイナー(またはその同僚)が推論(つまり、デザイン選択のソース)を表明する際のリソース(書籍、記事など)を意味します。

私はC ++とC#に見られる非対称性に困惑していますはい、C#はC ++ 2.0ではないことを知っています-C ++では演算子+=をオーバーロード+し、事前に定義された演算子に依存する適切な演算子をほぼ自動的に記述します C#では逆になります-オーバーロードし++=合成されます。

私が間違っていない場合、+=新しいオブジェクトを作成する必要があるため、実際の場合、後者のアプローチは最適化の機会を殺します。そのため、このようなアプローチには大きな利点がありますが、MSDNはあまりにも恥ずかしがり屋なので、それについて話すことはできません。

そして、その利点が何なのか疑問に思います-だから、C#の本、テクトークビデオ、ブログエントリで説明を見つけたら、参考に感謝します。

私が見つけた最も近いものは、Eric Lippertブログへのコメントです。C#でオーバーロードされた演算子が常に静的なのはなぜですか?トム・ブラウン。静的なオーバーロードが最初に決定された場合は、構造体に対してどの演算子をオーバーロードできるかを単に指定します。これにより、クラスで何をオーバーロードできるかがさらに決まります。


3
新しいC ++スタイルへのリンクはありますか?単純に、+=最初にオーバーロードするのはばかげているようです。なぜあなたはその部分ではなく、結合された操作をオーバーロードするのですか?
テラスティン

1
これらの用語は「複合代入演算子」と思います。
Ixrec

2
@greenoldman Telastynはおそらく、意味的に+ =が+と=の組み合わせであるため、+の観点から+ =を実装することは、他の方法よりも自然であると示唆していました。私の知る限り、+呼び出し+ =を持つことは、主に最適化の秘isです。
Ixrec

1
@Ixrec:時々、a + = bは理にかなっていますが、a = a + bはそうではありません:アイデンティティが重要であり、Aを複製できないことを考慮してください。時々、a = a + bは理にかなっていますが、a + = bはそうではありません。したがって、実際には、どれを個別にオーバーロードするかを決定する機能が必要です。もちろん、必要なすべてのビルディングブロックが存在し、明示的に無効化されていない場合は、不足しているものを自動生成することをお勧めします。C#がそのatmを許可しているわけではありません。
デデュプリケーター

4
@greenoldman-その動機は理解していますが、個人的には*=、参照型を変更することは意味的に正しくないことがわかります。
テラスティン

回答:


12

この参照は見つかりませんが、私の理解では、C#チームは演算子のオーバーロードの健全なサブセットを提供したいと考えていました。当時、オペレーターのオーバーロードにはラップが悪かった。人々はそれがコードを難読化し、悪のためにしか使用できないと断言しました。C#が設計されていた頃には、Javaはオペレーターのオーバーロードが煩わしいものではないことを示していました。

そのため、C#は、悪を行うのがより困難になるように演算子のオーバーロードのバランスを取ることを望んでいましたが、あなたも素敵なものを作ることができました。割り当てのセマンティクスを変更することは、常に悪と見なされたものの1つでした。せることにより+=、その親族が過負荷されるように、それはそういったことを可能にします。たとえば+=、新しい参照を作成するのではなく、参照を変更した場合、予想されるセマンティクスに従っていないため、バグが発生します。


よろしくお願いします。この質問をもう少し長く続けます。実際のデザインの理由で誰もあなたに負けない場合は、あなたの質問を受け入れて閉じます。もう一度-ありがとう。
greenoldman

@greenoldman-あなたもそうすべきです。私も誰かがより具体的な参考文献のある答えを持ってくることを望んでいます。
テラスティン

それで、これは、ポインターとポインティング先の両方について話すことの不可能性が、頭を楽に、そして明確に育てる場所ですか?いまいましい恥。
デデュプリケーター

「人々はそれがコードを難読化したと断言しました」-しかし、それはまだ真実です、あなたはいくつかのF#ライブラリを見ましたか?オペレーターのノイズ。例:quanttec.com/fparsec
デン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.