1

2つのプロパティとコンストラクターを持つクラスがあります。

public class Card
{
    public int CardName {get;set;}
    public bool IsActive {get;set;}

    public Card (int cardName, bool isActive)
    {
        CardName = cardName;
        IsActive = isActive;
    }
}

開発者に次の代わりにコンストラクターを使用させるにはどうすればよいですか?

var card = new Card{ CardName = "blab", IsActive = true };

ちなみに、上記のステートメントは何と呼ばれていますか?それは遅延読み込みステートメントですか?

4

3 に答える 3

4

あなたはすでに持っています。

空のコンストラクターがないため、オブジェクトを作成するオブジェクト初期化メソッドを使用する機能が削除されました。

これ:

var card = new Card{ CardName = "blab", IsActive = true };

これと同じです

var card = new Card() { CardName = "blab", IsActive = true };

そして、この文脈new Card()では無効です。

于 2012-07-16T15:46:47.210 に答える
1

それは、問題の構文を防止したい理由によって異なります。

オブジェクト初期化構文は、構築直後に一連のプロパティを設定するための省略形です。つまり、これ:

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;
  }
}
于 2012-07-16T16:03:00.007 に答える
0

プロパティのゲッターを「プライベート」として宣言します。のようなものPublic int CardName {private get; set;}

于 2012-07-16T15:46:53.573 に答える