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

ani*_*nax 5 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; }
}
Run Code Online (Sandbox Code Playgroud)

总而言之,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";
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,在行处抛出"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();
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Dav*_*vid 8

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

Locale englishLang = new Locale();
Run Code Online (Sandbox Code Playgroud)

以下值为null:

englishLang.region
englishLang.buttons
englishLang.fields
Run Code Online (Sandbox Code Playgroud)

因此,NullReferenceException如果您尝试取消引用这些字段,您将收到一个,就像您在此处所做的那样:

englishLang.region.center.title = "Center Region";
Run Code Online (Sandbox Code Playgroud)

该行代码试图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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • +1 - 我也觉得让一个聚合其他类的类实例化它们是一个好习惯,而不是让类消费者负担这个任务. (2认同)

And*_*ruz 5

您必须实例化每个对象:

Locale englishLang = new Locale(); 
englishLang.region = new Region();
englishLang.region.center = new Center();
englishLang.region.center.title = "Center Region";
Run Code Online (Sandbox Code Playgroud)

等等...

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