繁体   English   中英

C#中自动实现的属性默认值

[英]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;

您所有的属性如下所示:

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

而您的属性如下所示:

  • id = 1
  • 标记= 0

希望对您有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM