[英]Auto implemented properties default value in c#
性质
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为null)
默认情况下不启动吗? 任何原因?
自动属性的默认值为default(T)
,其中T
是类型。 由于任何引用类型的默认值为null
,所以mark
为null。 值类型永远不能为null,并且您已经注意到, default(int)
为0
。
所有引用类型的默认值为null而不是0。您应该在构造函数中对其进行初始化:
public student()
{
mark = new mark();
}
当您尝试访问mark.value
而没有mark.value
进行初始化时,您正在尝试访问一个null object's property
,这会导致NullReferenceException
:
null.value = NullReferenceException!
有关更多详细信息,请参见文档和此问题: 什么是NullReferenceException?如何解决它?
class是引用类型,所有引用类型都驻留在堆中,当您使用new创建其对象时会分配其内存。 因此,如果您不创建新对象(即不实例化该类),则该类将为null,即未为该类分配地址。
C#中的变量会自动采用其默认值(可以通过对它们调用default
来找到它们,例如default(int)
。
您的ID变量被初始化为零的原因是因为int的默认值为0。
您的Mark变量被初始化为null的原因是因为任何类的默认值为null。
引用类型的默认值为空引用。 如果您要描述的行为,请将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();
}
希望这可以帮助。
您指的是您在学生课堂中未初始化的对象实例标记。 有许多选项供您选择。 如果您坚持认为它们都应该是类,请在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; }
}
我想您看不到的是您实际上是在初始化学生,但根本没有标记! 使用初始化学生时
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;
而您的属性如下所示:
希望对您有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.