このトピックに関連するすべての質問を読んで、struct
のデフォルトのコンストラクタがC#で利用できない理由を説明しますが、この状況に直面したときに一般的な行動方針を提案した人はいません。デフォルトのコンストラクタを隠すために、盲目的に構造体をクラスに変換していますか?
明白な解決策は、struct
をclass
に変換し、その結果を処理することです。
他にもstruct
として保存するオプションはありますか?
この状況に私たちの内部コマースAPIオブジェクトの1つを使用しました。デザイナーはそれをclass
からstruct
に変換しました。そして、以前のプライベートであったデフォルトのコンストラクタは、オブジェクトを無効な状態にしています。
オブジェクトをstruct
のままにしておくと、状態の有効性をチェックするメカニズムが導入されるはずです(のようなもの)。私は多くの抵抗があり、「誰でもAPIを使うべきだ」という説明は、デフォルトコンストラクタを使うべきではありません。 (注:問題のオブジェクトは、staticファクトリメソッドを介して「適切に」構築され、他のすべてのコンストラクタはinternal
です。)
は、誰もが簡単に一も二もなく、このような状況でclass
ESにそのstruct
秒に変換されていますか?
編集:私はstruct
ように、オブジェクトのこのタイプを維持する方法についていくつかの提案を見たい - 上記の問題のオブジェクトは、多くの方が適しstruct
としてclass
としてよりもあります。
これは大きな質問です。ゼロアウト状態が有効になるように構造体を設計することはできますが、それだけでは必ずしも使用可能なAPIが得られるわけではありません。デフォルトのコンストラクターがある場合は、IDEにポップアップして最小の抵抗のパスを提供するため、必然的に呼び出す人もいます。コンパイラがキャッチしなければならない問題につながるか、不変のゼロアウト構造体にプロパティを設定しようとして時間を浪費します。私はC#でデフォルトのコンストラクタを隠すことができて、実際にゼロスアウトされた構造体が本当に必要な場合は、デフォルト(...)を呼び出すようにしてください。 –
実際にこれ以上調べてみると、使いやすさの問題は実際にはコンパイラではなくIntellisenseにあると思います。かつて、Visual StudioはIntellisenseのデフォルトのコンストラクタを表示していなかったようです。私の意見では、これは賢明なことです。しかし、人々は(ここを参照してください)(http://stackoverflow.com/questions/1429495/blindly-converting-structs-to-classes-to-hide-the-default-constructor)、ある時点で変更されている必要がありますが、 Visual Studio 2010は最初のオプションとして空のコンストラクタをポップアップしているので、 –