如何初始化对象?

时间:2010-04-05 16:52:43

标签: c#

我有一个这样的课程,

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";

我做错了什么?

7 个答案:

答案 0 :(得分: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" } };

答案 1 :(得分:5)

这是因为Name属性为null。您尚未为其指定值。

试试这个:

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" } 
};

答案 2 :(得分:2)

使用object initializer。虽然你的例子中的复杂对象非常冗长,但你可以做到

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

答案 3 :(得分:1)

您必须初始化人员的name属性。尝试:

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

当您定义类或结构时,C#语言(以及CLR确实)在实例化时将默认值分配给对象的所有字段。默认值特定于字段类型,但对于引用(在您的情况下为Name),默认值为null。您负责实例化对象。

处理这种情况的另一种方法是在name类的构造函数中创建一个默认的person实例;像这样:

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

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

答案 4 :(得分:1)

考虑到您要使用的代码,只需在人的构造函数中初始化您的name对象。

在更深层次上,您所犯的错误是通过访问Person类之外的Name属性来违反Law of Demeter

答案 5 :(得分:0)

您的课程需要constructor,当用于创建课程实例时,会为您的媒体资源分配值。

答案 6 :(得分:0)

尝试初始化人员和姓名

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

检查此article以获取有关命名约定的概述。