-
14-11-2019 - |
質問
C#
コンストラクタを書くときにどのようなアプローチを取るかについて私を助言することができますか?
C++
のような他の言語では、すべてが問題ありません - 通常、内部フィールドを表示してゲッター/セッターを提供していません。
これは、あなたのクラスをあなたのクラスをコンストラクタに提供することができ、あなたの地元のメンバーの一部を初期化し、幸せになれます。
C#
では、properties
があります。
Class x = new Class { Field1 = new Field1 ...., Field2 = new Field2 }
.
これはオブジェクト構築のための連鎖を可能にし、私が仮定するように、私たちがproperties
を持っていなかった場合に必要とされる多くのコンストラクタを削除することができます。
これをプロパティのデフォルト値と組み合わせると、実際にいくつかの作業を行う特殊化されていないコンストラクタを完全に取り除くことができます。
今 - 冗長コンストラクターを削除したり、フィールド初期化を介してオブジェクト構築を許可することはありませんか?
このアプローチの欠点は何ですか? 一般的な推奨事項を一般的な推奨事項を与えることができます。
ありがとうございました。
解決
私自身の経験則は簡単です。オブジェクトを完全に構築するために何かが必要な場合は、CTORパラメータです。
良い例は、StreamReaderやBinaryReaderのようなストリームヘルパーオブジェクトの1つです。関連付けられているストリームオブジェクトなしでは機能できませんので、コンストラクターで指定する必要があります。
他のヒント
私の意見では、あなたが冗長なコンストラクタとのものを持つことに何も問題ない。コンストラクターを定義したいと思うのに十分な意味がある場合は、その方法で本物の必要性があるためです。
コンストラクタを使用して、消費者にクラスに値を供給するように強制することができます。
マイサムのルールは、フィールドがオプションのデータのためのものですが、コンストラクタを使用して必要なデータを強制することができます。
問題は誤った二分法のものです。C ++はC# - "フィールド"(実際のプロパティであるフィールドはクラスレベルの変数です)と同じように動作します。一般的に、内部値を設定するためのゲッター/セッタとして使用され、フィールドを設定できるnew
構文はほんの数だけです。のために
Class x = new Class();
x.Field1 = new Field1();
x.Field2 = new Field2();
. ベストプラクティスは、使用可能な状態でオブジェクトを作成することです。財産セッターに頼りを制限してみてください。
不完全なオブジェクトを作成し、脆弱なコードが少なくなる可能性があります。
投稿したコードは、呼び出されたオブジェクトのイニシャライザを使用しています。Object Initializersを使用すると、コンストラクタと設定プロパティを呼び出すだけの簡単な方法です。C#のコンストラクタを他の言語で使用しているのと同じ方法でコンストラクタを使用する必要があります - 一般的な規則は、クラスがが正しく初期化されるためのオブジェクトまたは値が正しく初期化される場合、そのパラメータです。コンストラクタを通過する必要があります。値が必要ない場合は、設定可能なプロパティにするのは合理的です。
一般的に言って、可能な限り、のセッターを使用しないでください(多くの場合、多くの場合、多くの場合、多くの場合)
公共のパラメータのない構造のアプローチとそれに続くプロパティの初期化が続く(必須?)XAMLで使用するために人気がある(必須?)。
あなたが直面する唯一の問題は部分的に初期化されたオブジェクトであるが、そのフィールドを使用しようとする前にオブジェクト状態を単に検証することができます。
個人的には、コンストラクタに重要な値のパラメータを作成し、オブジェクトのコピーとオプションのパラメータの範囲からコピーコンストラクタを作成します。
オブジェクト初期化子構文は単なる構文砂糖です。C#1でもを書くことができます
Class c = new Class();
c.Property1 = value1;
c.Property2 = value2;
c.Property3 = value3;
....
.
C#3は基本的に構文を短縮します。
Class c = new Class
{
Property1 = value1,
Property2 = value2,
Property3 = value3
....
}
.
カウンチクラクタはフィールドを設定するだけではなく、コンストラクタはパラメータに基づいてオブジェクトを論理的に構築する必要があります。コンストラクタが戻ったときに使用する準備ができているオブジェクトです。
大丈夫ですか?まあ、それは... です
オブジェクトのイニタイザを使用するには、公衆セッターをすべてのフィールドに公開する必要があるでしょう、あなたはこれを望んでいないかもしれません。あなたがそれらを露出させて幸せであるならば、私は先に進んでコンストラクタを取り除きます。ただし、 CAN を行うことができるからといって、SOTERSはあなたがを意味するのではありません。私はあなたがすべてのあなたのフィールドが公開されていることを見つけたら、コンストラクタを削除する必要があります。
ここではドメインオブジェクトを参照しているのが疑いがありますが、サービスの場合、コンストラクターを通してサービスの依存関係を注入することは、依存関係を「新入れ」とは対照的に、サービスをより自己文書化します。さらに、これは依存性注入コンテナをより簡単に使用するために設定します。