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(例如 not )。null默认情况下,它被初始化null为任何对象引用的默认值。

你当然可以在 的构造函数中对其进行初始化WSUser,例如:

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

最有可能的是,您不能或不想这样做,因为您可能希望单个WSAccount实例被多个其他实例(其他类)使用。要么将帐户作为参数传递给WSUser构造函数,要么让调用者在构造后设置它。前者可能更可取,因为您的构造函数可以对输入进行一些完整性检查,并且您不能忘记在构造后设置帐户(因为构造函数会强制您事先传递一个)。

于 2013-02-02T23:59:57.167 回答
1

是的你是。

这是因为您的默认构造函数(如果没有重新定义,也没有)对它拥有的每个字段或自动属性使用默认值。意思是,每个 int 都获得 '0' 作为值,并且每个引用类型 (wsAccount) - null。

因此,您必须将 wsAccount 属性实例化为正确的对象,否则它为空。

于 2013-02-02T23:59:58.360 回答
1

所有类型都有其默认值:

  • 引用类型(包括字符串)=> null

  • 值类型 => (int=> 0, float=> 0 , Guid => Guid.Empty, etc..)

这就是您需要显式实例化 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 回答