9

C# の設計者がこのようなことを許可しなかったのはなぜですか?

public readonly class ImmutableThing
{
    ...
}

安全なマルチスレッド化の最も重要な方法の 1 つは、不変オブジェクト/クラスを使用することですが、クラスを不変として宣言する方法はありません。適切な実装によって不変にできることはわかっていますが、これをクラス宣言によって強制すると、はるかに簡単かつ安全になります。クラスを不変としてコメントすることは、せいぜい「ドア小道具」ソリューションです。

クラス宣言を一目見ただけで、それが不変であることがすぐにわかります。他の誰かのコードを変更する必要がある場合、クラスが意図的な変更を許可していないことがわかります。ここには利点しかありませんが、これまで誰も考えていなかったとは信じられません。では、なぜサポートされていないのでしょうか。

編集

これはそれほど重要な機能ではないと言う人もいますが、それは私を本当に納得させません. マルチコア プロセッサが登場したのは、周波数によるパフォーマンスの向上が壁にぶつかったためです。スーパーコンピューターは、高度なマルチプロセッサー マシンです。並列処理はますます重要になり、パフォーマンスを改善するための主要な方法の 1 つになっています。.NET でのマルチスレッドと並列処理のサポートは重要です (さまざまなロックの種類、スレッド プール、タスク、非同期呼び出し、同時コレクション、ブロッキング コレクション、並列 foreach、PLINQ など)。コードはより簡単に優位に立つことができます。実装するのは簡単ではありません。

4

2 に答える 2

12

基本的に、それは複雑だからです - そして usr が書いたように、機能を出荷する準備が整う前に、さまざまな方法で多くの作業が必要です。(安楽椅子の言語設計者になるのは簡単ですが、変更によって壊れることのない重要なコード ベースを持つ何百万もの開発者がいる言語で、実際にそれを行うのは信じられないほど難しいと確信しています。)

場合によっては、過度に制限することなく、型が目に見えて不変であることをコンパイラが検証するのは困難です。例として、Stringは実際には 内mscorlibで変更可能ですが、他のタイプ ( などStringBuilder) のコードは、その変更可能性が外の世界に知られることを避けるために非常に注意深く書かれています。

Eric Lippert は不変性について多くのことを書いています。これは複雑なトピックであり、実用的な言語機能にするには多くの作業が必要です。また、最初からそうではなかった言語やフレームワークに後付けすることも非常に困難です。私は C# が少なくとも不変型の記述を容易にしてくれることを望んでおり、チームはかなりの時間をかけてそれについて考えてきたのではないかと思います。別の問題。

于 2012-06-01T20:13:52.027 に答える
5

機能は、設計、実装、テスト、文書化、展開、およびサポートする必要があります。そのため、最も重要な機能を最初に取得し、それほど重要でない機能を遅らせるかまったく取得しません。

あなたの提案は大丈夫ですが、簡単な回避策があります(あなたが言ったように)。したがって、これは「緊急」機能ではありません。

また、オブジェクト内の状態の変更は許可されますが、外部からは決して可視化されない、表現上の不変性と呼ばれるものもあります。例: 遅延計算されたフィールド。フィールドは定期的に書き込まれますが、コンパイラはクラスが外部に対して不変であることを証明できないため、これはあなたの提案では不可能です。

于 2012-06-01T20:11:31.437 に答える