类声明是一个类c#时,类对象为null

时间:2015-10-19 21:59:24

标签: c# oop nullreferenceexception

public class s
{
    public string s1 { get; set; }
}

public class s2
{
    public s s3 { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        s2 objs2 = new s2();
        objs2.s3.s1 = "asdf";
    }
}

因为objs2.s3为null而导致运行时错误。我想知道如何实现这一目标。

请告诉我为什么会这样,所以如果你有时间的话。 感谢。

4 个答案:

答案 0 :(得分:3)

您永远不会在任何地方实际初始化s3。如果您始终希望它默认为s的新实例,则可以创建构造函数:

public class s2
{
    public s2()
    {
        s3 = new s();
    }
}

s2 objs2 = new s2();

或者,如果您不想修改s2,则只需在实例化对象时初始化该值:

s2 objs2 = new s2 { s3 = new s() };

答案 1 :(得分:1)

类s可以为空,因此默认情况下s3属性为null。您需要在使用前对其进行实例化。

一种方法是让类s2的构造函数为你创建一个实例。

然后会变成:

public class s2
{
    public s s3 { get; set; }
    public s2()
    {
      s3 = new s();
    }
}

答案 2 :(得分:1)

为了使您的代码有效,您需要使用s3运算符初始化s2实例的new属性,因为它是引用类型(check reference vs value types here)。

这是您缺少的一行:

s2.s3 = new s();

以下是可以正确运行的完整代码:

public class s
{
    public string s1 { get; set; }
}

public class s2
{
    public s s3 { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        s2 objs2 = new s2();
        s2.s3 = new s();
        objs2.s3.s1 = "asdf";
    }
}

答案 3 :(得分:1)

除了另一个答案,你可以在Main()中使用s3。

s2 objs2 = new s2()
{
    s3 = new s()
};