C# 用户代码未处理NullReferenceException-对象引用未设置为对象的实例
我有以下C#类课程: 总之,区域设置有区域、按钮和字段。该地区有中部和东部。中部和东部有产权。字段具有标签,标签的属性有firstName、lastName和chooseLocale 在方法(称为GetLocale)中,我有以下代码: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
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; }
}