属性
public class student
{
public int id { get; set; }
public mark mark { get; set; }
}
public class mark
{
public int value { get; set; }
}
我正在创建对象
student x=new student();
x.id=1 --> default value 0
但是当我访问 x.mark.value 时,它会抛出异常(x.mark为空)
默认不启动?有什么原因吗?
答案 0 :(得分:4)
自动属性的默认值为default(T)
,其中T
为类型。由于任何引用类型的默认值为null
,因此mark
为空。值类型永远不能为空,正如您所注意到的,default(int)
是0
。
答案 1 :(得分:3)
所有引用类型的默认值为 null 而不是0.您应该在构造函数中初始化它:
public student()
{
mark = new mark();
}
当您尝试访问mark.value
而未初始化时,您正试图访问导致null object's property
的{{1}}:
NullReferenceException
有关详细信息,请参阅documentation和此问题:What is a NullReferenceException and how do I fix it?
答案 2 :(得分:1)
类是引用类型,并且所有引用类型都驻留在堆中,当使用new创建对象时,它们的内存将被分配。因此,如果您没有创建新对象,即您没有实例化该类,它将保留null,即没有为该类分配地址。
答案 3 :(得分:0)
C#中的变量会自动采用默认值(可以通过调用default
来找到它们 - 例如default(int)
。
您的ID变量初始化为零的原因是因为int的默认值为0。
您的Mark变量被初始化为nullis的原因是因为任何类的默认值为null。
答案 4 :(得分:0)
默认值是空引用。如果您想要所描述的行为,请将mark
作为结构:
public struct mark
{
public int value { get; set; }
}
student x = new student();
x.id = 1;
x.mark.value = 5; // No exception thrown
作为替代方案,只需在构造函数中new
mark
:
public student()
{
this.mark = new mark();
}
希望这有帮助。
答案 5 :(得分:0)
您指的是您未在学生班级中初始化的对象实例标记。 有很多选择。如果你坚持认为它们都应该是类,那么在Student
的默认构造函数中创建一个Mark实例public class Student
{
public Student()
{
this.mark = new Mark();
}
public int id { get; set; }
public Mark mark { get; set; }
}
public class Mark
{
public int value { get; set; }
}
答案 6 :(得分:0)
我猜,你没看到的是,你实际上正在初始化学生,但根本没有标记! 在使用
初始化学生时student s = new student();
s.id = 1;
您的所有属性都是这样的:
如果你像这样扩展你的学生班的构造函数:
public class student
{
public student() {
this.mark = new mark();
}
public int id { get; set; }
public mark mark { get; set; }
}
调用
时,您将达到默认值0的目标x.mark.value;
虽然您的属性看起来像这样:
我希望这可以帮到你!