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

C# 用户代码未处理NullReferenceException-对象引用未设置为对象的实例,c#,nullreferenceexception,C#,Nullreferenceexception,我有以下C#类课程: 总之,区域设置有区域、按钮和字段。该地区有中部和东部。中部和东部有产权。字段具有标签,标签的属性有firstName、lastName和chooseLocale 在方法(称为GetLocale)中,我有以下代码: Locale englishLang = new Locale(); englishLang.region.center.title = "Center Region"; englishLang.region.east.title = "East Region

我有以下C#类课程:

总之,区域设置有区域、按钮和字段。该地区有中部和东部。中部和东部有产权。字段具有标签,标签的属性有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();

我做错了什么?

在指定值之前,必须初始化属性/子属性:

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

您必须实例化每个对象:

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


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

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

Locale englishLang = new Locale();
以下值为
null

englishLang.region
englishLang.buttons
englishLang.fields
因此,如果您尝试取消引用这些字段,您将收到一个
NullReferenceException
,如下所示:

englishLang.region.center.title = "Center Region";
该行代码试图通过引用其
中心
属性来取消对
englishLang.region
的引用。但是
region
null
,因为它还没有被实例化

在这些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();
    }
}

这样,使用代码不必每次都手动执行此操作,只要您创建
区域设置的实例
,构造函数就会自动实例化字段。当然,您希望对其他对象重复相同的模式。

您使用的是自动属性,默认情况下,引用类型的属性返回
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; }
}

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

+1-我也认为,让一个类聚合其他类来实例化它们,而不是让类使用者承担该任务是一个很好的做法。如果此代码的目的是支持不同的语言,我建议您看看.Net framework中的参考资料。几乎所有
NullReferenceException
的情况都是相同的。有关提示,请参阅“”。
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; }
}