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

标签 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; }
}

总结起来,Locales有Region、Buttons和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";

我是不是在设置属性 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();

我做错了什么?

最佳答案

您的 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 的实例,构造函数就会自动实例化这些字段。自然地,您会希望对其他对象重复相同的模式。

关于c# - NullReferenceException 未被用户代码处理 - 对象引用未设置为对象的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22408075/

相关文章:

plugins - 自定义 SpecFlow TestGeneratorProvider 注册在测试生成时导致 NullReferenceException

.net - 避免在 StyleHelper.OnBindingValueInTemplateChanged 中发生 NullReferenceException 崩溃

c# - 在永远不会重新分配字段的情况下,复制方法主体中字段的引用以读取它有什么好处?

c# - 使用获取 "Object reference not set to an instance of an object"的任务

c# - 在 XPath 中使用下划线和句点

c# - 在 C# 中通过 SSH 连接到 Ubuntu VM

c# - NullReferenceException 未处理 - 不确定什么是 null

.net - 警告 : Variable is passed by reference before it has been assigned a value. 运行时可能会导致空引用异常

c# - 创建新流程是否有助于我遍历一棵大树?

c# - C# 3.0 中的概念