NullReferenceException未被用户代码处理 - 对象引用未设置为对象的实例

时间:2014-03-14 14:39:10

标签: c# nullreferenceexception

我有以下C#类:

public class Locales
{
    public Region region { get; set; }
    public Buttons buttons { get; set; }
    public Fields fields { get; set; }
}

public class Region
{
    public Center center { get; set; }
    public East east { get; set; }
}

public class Center
{
    public string title { get; set; }
}

public class East
{
    public string title { get; set; }
}

public class Buttons
{
    public string save { get; set; }
}

public class Fields
{
    public Labels labels { get; set; }
}

public class Labels
{
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string chooseLocale { get; set; }
}

总而言之,Locales具有Region,Buttons和Fields。地区有中心和东部。中心和东部有财产权。 Fields具有标签,其属性包括firstName,lastName和chooseLocale。

在一个方法(称为GetLocale)中,我有以下代码:

Locale englishLang = new Locale(); 
englishLang.region.center.title = "Center Region";
englishLang.region.east.title = "East Region - Form";
englishLang.buttons.save = "Save";
englishLang.fields.labels.firstName = "First Name";
englishLang.fields.labels.lastName = "Last Name";
englishLang.fields.labels.chooseLocale = "Choose Your Locale";

当我运行代码时," NullReferenceException未被用户代码"处理。被抛出:englishLang.region.center.title = "Center Region";

我在设置属性title,save,firstName,lastName和chooseLocale的方式上做错了吗? 我尝试在Locale englishLang = new Locale();之后和englishLang.region.center.title = "Center Region";之前添加以下代码块,但我仍然收到错误消息。

Region region = new Region();
Center center = new Center();
East east = new East();
Buttons buttons = new Buttons();
Fields fields = new Fields();
Labels labels = new Labels();

我做错了什么?

4 个答案:

答案 0 :(得分:8)

您的Locales对象永远不会实例化其属性,消费代码也不会实例化它们。作为引用类型,该类中的属性具有默认值null。所以当你这样做时:

Locale englishLang = new Locale();

以下值为null

englishLang.region
englishLang.buttons
englishLang.fields

因此,如果您尝试取消引用这些字段,则会收到NullReferenceException,就像您在此处一样:

englishLang.region.center.title = "Center Region";

该行代码尝试通过引用其englishLang.region属性来取消引用center。但是regionnull,因为它尚未实例化。

在这些DTO类的情况下实例化那些的最佳位置可能在它们的构造函数中。像这样:

public class Locales
{
    public Region region { get; set; }
    public Buttons buttons { get; set; }
    public Fields fields { get; set; }

    public Locales()
    {
        region = new Region();
        buttons = new Buttons();
        fields = new Fields();
    }
}

这种方式消耗代码不必每次都手动执行此操作,每次创建Locales实例时,构造函数都会自动实例化字段。当然,您需要为其他对象重复相同的模式。

答案 1 :(得分:5)

您必须实例化每个对象:

Locale englishLang = new Locale(); 
englishLang.region = new Region();
englishLang.region.center = new Center();
englishLang.region.center.title = "Center Region";

依旧......

或者您可以在父类的构造函数中实例化依赖对象。

答案 2 :(得分:4)

您必须在分配值之前初始化属性/子属性:

Locale englishLang = new Locale(); 
englishLang.region = new Region();
englishLang.region.center = new Center();
englishLang.region.center.title = "Center Region";

答案 3 :(得分:2)

您正在使用自动属性,默认情况下,它们会返回null作为参考类型。您需要初始化属性,可能在构造函数中:

public class Locales
{
    public Locales()
    {
        this.region =  new Region();
        this.buttons = new Buttons();
        this.fields = new Fields();
    }

    public Region region { get; set; }
    public Buttons buttons { get; set; }
    public Fields fields { get; set; }
}

您还需要向其他类添加类似的代码。