2010-04-05 118 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