[解決済み] C# (.NET)の設計上の欠点【非公開
2023-05-01 06:34:13
質問
C#や.NET Framework全般における最大の設計上の欠陥は何でしょうか?
例:NULLでない文字列型がなく、IDataReaderから値をフェッチするときにDBNullをチェックしなければならない。
どのように解決するのですか?
に力強く同意します。 この記事 のような形式を使用することができます (ToStringの欠如をうんぬんする人のために、クラスにカスタムフォーマットを提供するためのデバッガ属性があります)。
上記のリストに加え、私は以下の合理的な要求も追加します。
- null 可能な値型を補完するものとして、non-null 可能な参照型。
- 構造体の空のコンストラクタのオーバーライドを許可します。
- シールされたクラスを指定するための一般的な型制約を許可する。
-
私は、制約として使用されるとき、任意のコンストラクタ署名を要求した、ここの別のポスターに同意します。
T : new(string)
またはT : new(string, int)
- 私はまた、空のイベント リストと同時実行設定 (後者は厄介ですが) の両方について、イベントを修正することについて、ここの別の投稿者に同意します。
- 演算子は、クラスの静的メソッドとしてではなく、拡張メソッドとして定義されるべきです (または、少なくとも静的メソッドとしてだけではありません)。
- はインターフェイスの静的プロパティとメソッドを許可する (Java にはこれがあるが、C# にはない)。
- オブジェクトのイニシャライザーでイベントの初期化を許可する (現在はフィールドとプロパティのみが許可されている)。
-
なぜ "オブジェクト・イニシャライザー" 構文は、オブジェクトを作成するときにのみ使用可能なのですか? なぜ、いつでも利用できるようにしないのでしょうか。
var e = new Foo(); e { Bar = baz };
- 二次列挙可能な挙動を修正 ,
- すべてのコレクションは、反復処理のために不変のスナップショットを持つべきである(すなわち、コレクションの変異はイテレータを無効化すべきではない)。
-
タプルは簡単に追加できますが、" のような効率的な閉じた代数型が必要です。
Either<T>
のような効率的な閉じた代数型を宣言し、それに対して網羅的なパターン マッチングを強制する方法が欲しいです (基本的に visitor パターンのファーストクラスのサポートですが、はるかに効率的です)。 - 私は一般的なパターン マッチングのサポートを望みますが、少なくともオブジェクト タイプ テストのためのものです。
-
私は別の投稿に同意します。
System.IO
のようなクラスはStream
のようなクラスは、やや貧弱に設計されています。NotSupportedException
を投げることを一部の実装に要求するインターフェースは悪い設計です。 -
IList
は今よりもずっとシンプルであるべきです。実際、これは多くの具象コレクションインターフェース、例えばICollection
, - 例えばIDictionaryのように、例外を投げるメソッドが多すぎる。
- 私は、Javaで利用可能なものよりも優れたチェックされた例外のフォームを希望します(これがどのように行うことができるかについては、型と効果のシステムに関する研究を参照してください)。
- たとえば、2 つのオーバーロードされた拡張メソッドを提供してみて、1 つは参照型、もう 1 つは nullable 構造体型で操作し、型推論がそれをどのように好むかを見てください。
-
のようなインターフェースのフィールド名とメンバー名を安全に反映させる方法を提供します。
INotifyPropertyChanged
のような、フィールド名を文字列として受け取るインターフェースに対して、 フィールド名とメンバー名を安全に反映させる方法を提供します。MemberExpression
, ie.() => Foo
といった具合ですが、これはあまり効率的ではありません。-
更新:C# 6.0では
nameof()
演算子が追加されましたが、これはジェネリックでは動作しません (nameof(T) == "T"
の代わりに、実際の型引数の名前を指定する必要があります。typeof(T).Name
)) - また、quot;path" の文字列を取得することもできません。nameof(this.ComplexProperty.Value) == "Value"
のような "path"文字列を取得することもできません。
-
更新:C# 6.0では
-
インターフェイスでの演算子を許可し、すべてのコア数値型に
IArithmetic
他の有用な共有演算子インターフェイスも可能です。 -
オブジェクトのフィールドやプロパティを変更することを難しくするか、少なくとも、不変フィールドの注釈を許可し、型チェッカがそれを強制するようにする(単にゲッターのみのプロパティとして扱うのです、難しくありません!)。
-
更新:C#では
readonly
キーワードがあり、C# 6.0 では読み取り専用の自動プロパティが追加されましたが、これは不変の型と値に対する真の言語サポートほど厳密ではありません。
-
更新:C#では
- 私は F# のアプローチが好きですが、クラス名の代わりに単に "new" を要求するここの他の投稿の方が、少なくとも優れています。
今のところ、これで十分だと思います。これらはすべて、私がこの 1 週間で遭遇した苛立ちです。本当にその気になれば、何時間でも続けられるでしょう。C# 4.0 はすでに名前付き、オプション、およびデフォルトの引数を追加していますが、私はこれを強く支持します。
さて、1 つの不合理な要求です。
- それは 本当に、本当に C#/CLR がタイプコンストラクタポリモーフィズム、つまりジェネリクスを超えるジェネリクスをサポートできればいいのですが。
お願いします。)
関連
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み] Interopタイプの組み込みができない
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] 特定のプロパティに対するLINQのDistinct()
-
[解決済み] JavaScriptSerializer - 列挙型を文字列としてJSONシリアライズする
-
[解決済み] LINQのGroup by
-
[解決済み] .NET Coreと.NET Standard Class Libraryのプロジェクトタイプの違いは何ですか?
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] C#のインターフェイス。暗黙の実装と明示の実装
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] C#や.NETで最悪のガチャは何ですか?[クローズド]