2010-04-05 122 views
1

我有這樣一個類,如何初始化一個對象?

public class person 
{ 
name Name {set; get;} 
string Address {set; get;} 
} 

public class name 
{ 
    string First {set; get;} 
    string Last {set; get;} 
} 

現在,當我創建對象的嘗試設置的第一個或最後一個名字,我得到一個錯誤。 「你調用的對象是空的。」

person Person = new person(); 
Person.Name.First = "John"; 
Person.Name.Last ="Smith"; 

我在做什麼錯?

+4

不是您的問題的解決方案,但您應該遵循指導原則並使用Pascal外殼來輸入類型名稱。即使用人而不是人。 – 2010-04-05 16:54:58

回答

6

您需要初始化名稱類的實例也

person Person = new person(); 
Person.Name = new name(); 
Person.Name.First = "A"; 

你也可以,如果你想

完成這件事 person構造
public class person 
    { 
     public name Name { set; get; } 
     string Address { set; get; } 

     public person() 
     { 
      Name = new name(); 
     } 
    } 

甚至嘗試

person Person = new person { Name = new name { First = "A", Last = "B" } }; 
5

這是因爲Name屬性爲空。你還沒有給它賦值。

試試這個:

person p = new person(); 
p.Name = new Name(); 
p.Name.First = "John"; 
p.Name.Last = "Smith"; 

或者使用從C#3.0和較新的對象初始化語法:

var p = new person { Name = new name { 
    First = "John", Last = "Smith" } 
}; 
+1

根據他們的類型名稱,這應該是'person p = new person();'。不是我同意他們的命名約定。 – 2010-04-05 16:57:26

+0

@Jeff,同意。將修復代碼示例。 – driis 2010-04-05 16:58:43

2

使用object initializer。雖然它是在你的例子複雜的對象非常詳細,你可以做

new Person { Name = { First = "John", Last = "Smith" } }; 
1

您必須初始化人的name財產。嘗試:

person Person = new person(); 
person.name = new name(); 
Person.Name.First = "John"; 
Person.Name.Last ="Smith"; 

當你定義一個類或結構,當它被實例化的C#語言(和CLR真的)分配默認爲對象的所有領域。默認值是特定於字段的類型,但對於參考(其中Name是您的情況),默認值爲null。你負責實例化對象。

處理這種情況的另一種方法是在person類的構造函數中創建一個默認的name實例;像這樣:

public class person 
{ 
    name Name {set; get;} 
    string Address {set; get;} 

    public Person() { Name = new name(); } 
} 
0

類別需要一個constructor,當被用來創建類的實例,將值分配給你的屬性。

0

嘗試初始化的人,名字

person Person = new person(); 
person.name = new name(); 
Person.Name.First = "John"; 
Person.Name.Last ="Smith"; 

檢查這個article有關命名約定的概述。

1

由於您要使用的代碼,只需初始化對象的構造函數中的對象name

在更深層次上,您做錯的是通過訪問Person類以外的Name屬性來違反Law of Demeter

+0

+1指向LoD ...(我還在學習) – 2010-04-05 17:08:37