1. ホーム
  2. c#

[解決済み] C# (.NET)の設計上の欠点【非公開

2023-05-01 06:34:13

質問

C#や.NET Framework全般における最大の設計上の欠陥は何でしょうか?

例:NULLでない文字列型がなく、IDataReaderから値をフェッチするときにDBNullをチェックしなければならない。

どのように解決するのですか?

に力強く同意します。 この記事 のような形式を使用することができます (ToStringの欠如をうんぬんする人のために、クラスにカスタムフォーマットを提供するためのデバッガ属性があります)。

上記のリストに加え、私は以下の合理的な要求も追加します。

  1. null 可能な値型を補完するものとして、non-null 可能な参照型。
  2. 構造体の空のコンストラクタのオーバーライドを許可します。
  3. シールされたクラスを指定するための一般的な型制約を許可する。
  4. 私は、制約として使用されるとき、任意のコンストラクタ署名を要求した、ここの別のポスターに同意します。 T : new(string) または T : new(string, int)
  5. 私はまた、空のイベント リストと同時実行設定 (後者は厄介ですが) の両方について、イベントを修正することについて、ここの別の投稿者に同意します。
  6. 演算子は、クラスの静的メソッドとしてではなく、拡張メソッドとして定義されるべきです (または、少なくとも静的メソッドとしてだけではありません)。
  7. はインターフェイスの静的プロパティとメソッドを許可する (Java にはこれがあるが、C# にはない)。
  8. オブジェクトのイニシャライザーでイベントの初期化を許可する (現在はフィールドとプロパティのみが許可されている)。
  9. なぜ "オブジェクト・イニシャライザー" 構文は、オブジェクトを作成するときにのみ使用可能なのですか? なぜ、いつでも利用できるようにしないのでしょうか。 var e = new Foo(); e { Bar = baz };
  10. 二次列挙可能な挙動を修正 ,
  11. すべてのコレクションは、反復処理のために不変のスナップショットを持つべきである(すなわち、コレクションの変異はイテレータを無効化すべきではない)。
  12. タプルは簡単に追加できますが、" のような効率的な閉じた代数型が必要です。 Either<T> のような効率的な閉じた代数型を宣言し、それに対して網羅的なパターン マッチングを強制する方法が欲しいです (基本的に visitor パターンのファーストクラスのサポートですが、はるかに効率的です)。
  13. 私は一般的なパターン マッチングのサポートを望みますが、少なくともオブジェクト タイプ テストのためのものです。
  14. 私は別の投稿に同意します。 System.IO のようなクラスは Stream のようなクラスは、やや貧弱に設計されています。 NotSupportedException を投げることを一部の実装に要求するインターフェースは悪い設計です。
  15. IList は今よりもずっとシンプルであるべきです。実際、これは多くの具象コレクションインターフェース、例えば ICollection ,
  16. 例えばIDictionaryのように、例外を投げるメソッドが多すぎる。
  17. 私は、Javaで利用可能なものよりも優れたチェックされた例外のフォームを希望します(これがどのように行うことができるかについては、型と効果のシステムに関する研究を参照してください)。
  18. たとえば、2 つのオーバーロードされた拡張メソッドを提供してみて、1 つは参照型、もう 1 つは nullable 構造体型で操作し、型推論がそれをどのように好むかを見てください。
  19. のようなインターフェースのフィールド名とメンバー名を安全に反映させる方法を提供します。 INotifyPropertyChanged のような、フィールド名を文字列として受け取るインターフェースに対して、 フィールド名とメンバー名を安全に反映させる方法を提供します。 MemberExpression , ie. () => Foo といった具合ですが、これはあまり効率的ではありません。
    • 更新:C# 6.0では nameof() 演算子が追加されましたが、これはジェネリックでは動作しません ( nameof(T) == "T" の代わりに、実際の型引数の名前を指定する必要があります。 typeof(T).Name )) - また、quot;path" の文字列を取得することもできません。 nameof(this.ComplexProperty.Value) == "Value" のような "path"文字列を取得することもできません。
  20. インターフェイスでの演算子を許可し、すべてのコア数値型に IArithmetic 他の有用な共有演算子インターフェイスも可能です。
  21. オブジェクトのフィールドやプロパティを変更することを難しくするか、少なくとも、不変フィールドの注釈を許可し、型チェッカがそれを強制するようにする(単にゲッターのみのプロパティとして扱うのです、難しくありません!)。
    • 更新:C#では readonly キーワードがあり、C# 6.0 では読み取り専用の自動プロパティが追加されましたが、これは不変の型と値に対する真の言語サポートほど厳密ではありません。
  22. 私は F# のアプローチが好きですが、クラス名の代わりに単に "new" を要求するここの他の投稿の方が、少なくとも優れています。

今のところ、これで十分だと思います。これらはすべて、私がこの 1 週間で遭遇した苛立ちです。本当にその気になれば、何時間でも続けられるでしょう。C# 4.0 はすでに名前付き、オプション、およびデフォルトの引数を追加していますが、私はこれを強く支持します。

さて、1 つの不合理な要求です。

  1. それは 本当に、本当に C#/CLR がタイプコンストラクタポリモーフィズム、つまりジェネリクスを超えるジェネリクスをサポートできればいいのですが。

お願いします。)