我有一个这样的课程,
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";
我做错了什么?
答案 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以获取有关命名约定的概述。