1
    [DataContract]
        [Serializable]
        public class WSAccount
        {
            [DataMember]
            public string AccountNumber { get; set; }
            [DataMember]
            public string Pin { get; set; }        
        }

 [DataContract]
    [Serializable]
    public class WSUser
    {
       [DataMember]
        public WSAccount wsAccount { get; set; }
        [DataMember]
        public bool IsValidUser { get; set; }
    }

実行中にエラーが発生する

WSUser user = new WSUser();
 user.wsAccount.AccountNumber = userNameresponse.account.ID;

しかし、

 WSUser user = new WSUser();
 user.wsAccount = new WSAccount();
 user.wsAccount.AccountNumber = userNameresponse.account.ID;

子クラスWSAccountをインスタンス化する必要がありますか?

4

3 に答える 3

1

はい、そのプロパティまたはメソッドにアクセスする場合はwsAccount、有効である必要がありますWSAccount(たとえば、そうではありません)。デフォルトでは、オブジェクト参照のデフォルトであるnull初期化されます。null

もちろん、のコンストラクター内で初期化することもできますWSUser。たとえば、次のようになります。

public WSUser() {
    wsAccount = new WSAccount();
}

WSAccountほとんどの場合、1つを(他のクラスの)他の複数のインスタンスで使用する必要があるため、これを実行できないか、実行したくない場合があります。アカウントをパラメーターとしてWSUserコンストラクターに渡すか、作成後に呼び出し元にアカウントを設定させます。コンストラクターは入力に対していくつかの健全性チェックを実行でき、構築後にアカウントを設定することを忘れることができないため、前者がおそらく望ましいです(コンストラクターは事前にアカウントを渡すように強制するため)。

于 2013-02-02T23:59:57.167 に答える
1

そうです。

これは、デフォルトのコンストラクター(再定義されていない場合、および再定義されていない場合)が、所有するすべてのフィールドまたは自動プロパティにデフォルト値を使用するためです。つまり、すべてのintは値として「0」を取得し、すべての参照型(wsAccount)-nullを取得します。

したがって、wsAccountプロパティを正しいオブジェクトにインスタンス化する必要があります。そうしないと、nullになります。

于 2013-02-02T23:59:58.360 に答える
1

すべての型にはデフォルト値があります。

  • 参照型 (文字列を含む) => null

  • 値の型 => (int=> 0、float=> 0、Guid => Guid.Empty など)

そのため、WSAccount クラスを明示的にインスタンス化する必要があります。WSUser のコンストラクターで WSAccount をインスタンス化することもできます

public WSUser()
{
  this.wsAccount = new WSAccount();
}

または、wsAccount を遅延ロードすることもできます

private WSAccount _wsAccount;

public WSAccount WsAccount
{
  get 
  { 
    if (_wsAccount==null)
      _wsAccount= new WSAccount();
    return _wsAccount;
  }
  set { _wsAccount = value }            
}

ついに、

Lazy<T>C# 4.0 から利用可能なを使用して、遅延ロードされた変数を実装できます。

ただし、逆シリアル化中に、デシリアライザーは内部でデフォルトのコンストラクターを呼び出し、それに応じてプロパティを設定するため、次のようにします。

WSUser user = new WSUser();
user.wsAccount = new WSAccount();
user.wsAccount.AccountNumber = <value>
于 2013-02-03T00:08:20.687 に答える