2013-02-02 56 views
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解決?

回答

1

是的,你這樣做。

這是因爲您的默認構造函數(如果沒有重新定義,它不是)爲每個字段或自動屬性使用默認值。意思是,每個int值都是'0',每個引用類型(wsAccount) - null。

因此,您必須將wsAccount屬性實例化爲正確的對象,否則它爲空。

1

是的,如果你想訪問它的任何屬性或方法,你需要wsAccount是一個有效的WSAccount(例如不是null)。默認情況下,它被初始化爲null,這是任何對象引用的默認值。

當然,你可以初始化它的WSUser在構造函數中,如:

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

最有可能的,你不能或不想做,雖然,因爲你可能需要一個WSAccount被其他類的其他實例使用。將帳戶作爲參數傳遞給WSUser構造函數,或讓構造函數在調用者設置之後進行設置。前者可能更可取,因爲你的構造函數可以對輸入做一些理智的檢查,並且你不能忘記在構造之後設置賬號(因爲構造函數會強制你事先傳遞一個)。

1

所有類型的具有其默認值:

  • 引用類型(包括字符串)=>空

  • 值類型=>(INT => 0,浮=> 0,的Guid => Guid.Empty,等..)

這就是爲什麼你需要顯式實例化WSAccount類。 您也可以實例WSAccount在WSUser

的構造
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

但是,在反序列化過程中,反序列化器將在引擎蓋下調用de然後設置相應的屬性,因此這樣做:

WSUser user = new WSUser(); 
user.wsAccount = new WSAccount(); 
user.wsAccount.AccountNumber = <value> 
相關問題