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)
我究竟做错了什么?
您的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属性来取消引用.不过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();
}
}
Run Code Online (Sandbox Code Playgroud)
这种方式消耗代码不必每次都手动执行此操作,每次创建实例时,构造函数都会自动实例化字段Locales.当然,您需要为其他对象重复相同的模式.
您必须实例化每个对象:
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)
等等...
或者,您可以在父类的构造函数中实例化依赖对象.