提问者:小点点

用户代码未处理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; }
}

总而言之,区域设置有区域、按钮和字段。区域有中心和东部。中心和东部拥有产权。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 was unhandled by user code”: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();

我做错了什么?


共1个答案

匿名用户

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

Locale englishLang = new Locale();

以下值为null:

englishLang.region
englishLang.buttons
englishLang.fields

因此,如果尝试取消引用这些字段,将收到NullReferenceException,如下所示:

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

该行代码试图通过引用其center属性来取消引用EnglishLang.Region。但是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实例,就会由构造函数自动实例化字段。当然,您会希望对其他对象重复相同的模式。