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";用户代码处理”: englishLang.region.center.title = "Center Region";

我在设置属性title,save,firstName,lastName和chooseLocale的方式上做错了吗? 我尝试在Locale englishLang = new Locale();之后添加以下代码块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(); 

我究竟做错了什么?

您的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实例时,构造函数都会自动实例化字段。 当然,您需要为其他对象重复相同的模式。

您必须实例化每个对象:

 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"; 

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

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