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

时间:2014-01-31 07:58:00

标签: c# .net

属性

 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为空)

默认不启动?有什么原因吗?

7 个答案:

答案 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;

您的所有属性都是这样的:

  • id = 1
  • mark = null

如果你像这样扩展你的学生班的构造函数:

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
  • mark = 0

我希望这可以帮到你!