それは、問題の構文を防止したい理由によって異なります。
オブジェクト初期化構文は、構築直後に一連のプロパティを設定するための省略形です。つまり、これ:
var c = new Card { CardName = "foo", IsActive = true };
これと意味的に同じです:
var c = new Card();
c.CardName = "foo";
c.IsActive = true;
どちらの場合も、コンストラクターは実行されますが、その直後に一連のプロパティ初期化子が続き、新しいオブジェクトに適用されます。
あなたの場合、パラメーターのないコンストラクターがないため、投稿した方法でオブジェクト初期化構文を使用することはできません。ただし、オブジェクト初期化子と一緒にコンストラクターパラメーターを渡すことは合法であるため、クラスでは次のことが合法です。
var c = new Card("", false) { CardName = "foo", IsActive = true };
(この構文は、値をコンストラクターに渡すだけでなく、値の意味をより明確にするものであると主張することもできます。また、値が過度に頑固であると主張することもできます:)どちらの方法でもかまいません)
これらのプロパティのパブリックセッターを削除することで、この2番目の構文が機能しないようにすることができます。ユーザーがコンストラクターに渡される値を変更できないようにすることが目標である場合、Card
たとえば、不変のオブジェクトを作成するのがその方法です。
ただし、後輩の1人が職場でこの質問をした場合、オブジェクトの初期化が使用されないようにする必要があると彼らが判断した理由を知りたいと思います。もちろん、正当な理由がありますが、通常、それらは質問のソースではありません。オブジェクト初期化子は良いことです-この構文が非常に便利な場合があり(特にLINQで)、私はいつもそれを使用しています。
初期値に基づいてコンストラクターで何らかの設定を行ったが、それらのプロパティがパブリック設定可能である場合、ユーザーが構築後にこれらの値を変更する場合に対処する必要があります。オブジェクトが最初に構築されたときに何らかの「セットアップ」コードが確実に発生するようにすることが目標である場合は、そのコードをデフォルトのコンストラクターに配置し、それらをチェーンします。
public class Card
{
public string CardName { get; set; }
public bool IsActive { get; set; }
public Card()
{
// setup code here.
}
public Card ( string name, bool active )
: this()
{
this.CardName = name;
this.IsActive = active;
}
}