C# 尝试设置类属性时出现NullReferenceException

C# 尝试设置类属性时出现NullReferenceException,c#,mono,nullreferenceexception,C#,Mono,Nullreferenceexception,基本上我有两个类,“Manifest”和“BrowserAction”,如下所示: public class BrowserAction { public string default_icon {get; set;} public string default_title {get; set;} public string default_popup {get; set;} } public class Manifest { public BrowserAc

基本上我有两个类,“Manifest”和“BrowserAction”,如下所示:

public class BrowserAction
{
    public string default_icon {get; set;}
    public string default_title {get; set;}
    public string default_popup {get; set;}
}


public class Manifest
{
    public BrowserAction browser_action {get; set;}
}
public void setManifest()
{
    Manifest newManifest = new Manifest();
    newManifest.browser_action.default_popup = "popup.html";
}
public class Manifest
{
    public Manifest()
    {
           this.browser_action = new BrowswerAction;
    }

    public BrowserAction browser_action {get; set;}
}
问题是,当我尝试设置清单类“browser\u action.default\u”弹出窗口的实例时,如下所示:

public class BrowserAction
{
    public string default_icon {get; set;}
    public string default_title {get; set;}
    public string default_popup {get; set;}
}


public class Manifest
{
    public BrowserAction browser_action {get; set;}
}
public void setManifest()
{
    Manifest newManifest = new Manifest();
    newManifest.browser_action.default_popup = "popup.html";
}
public class Manifest
{
    public Manifest()
    {
           this.browser_action = new BrowswerAction;
    }

    public BrowserAction browser_action {get; set;}
}
我得到一个System.NullReferenceException。我环顾四周,但似乎找不到问题所在。它适用于“Manifest”类的其他属性,这些属性只是字符串等


如果相关的话,我的IDE是MonoDevelop 2.4,我的框架是Mono2.6.7。

您正在访问新创建的实例的属性
browser\u action
,该实例仍然
newManifest

将您的示例更改为:

public void setManifest()
{
    Manifest newManifest = new Manifest();
    newManifest.browser_action = new BrowserAction();
    newManifest.browser_action.default_popup = "popup.html";
}
我假设
BrowserAction
有一个无参数的公共可访问构造函数

或一次性:

public void setManifest()
{
    Manifest newManifest = new Manifest()
        {
            browser_action = new BrowserAction()
                {
                    default_popup = "popup.html"
                }
        };
}

在访问该实例上的属性之前,您还必须初始化
browser\u action

newManifest.browser_action= new BrowserAction();

我认为
Manifest.browser\u操作
属性返回null,因为您没有初始化它。在访问对象的属性之前创建对象:

Manifest newManifest = new Manifest();
newManifest.browser_action = new BrowserAction();
newManifest.browser_action.default_popup = "popup.html";

您已经初始化了newManifest,但browser\u操作仍然为空(可能是空的)

然后,您尝试在空浏览器\u操作上设置默认\u弹出窗口,并获取异常


newManifest.浏览器操作。默认值为popup=“popup.html”

浏览器\u操作尚未初始化。向清单类添加无参数构造函数,如下所示:

public class BrowserAction
{
    public string default_icon {get; set;}
    public string default_title {get; set;}
    public string default_popup {get; set;}
}


public class Manifest
{
    public BrowserAction browser_action {get; set;}
}
public void setManifest()
{
    Manifest newManifest = new Manifest();
    newManifest.browser_action.default_popup = "popup.html";
}
public class Manifest
{
    public Manifest()
    {
           this.browser_action = new BrowswerAction;
    }

    public BrowserAction browser_action {get; set;}
}

引用类型对象的默认值为null。在使用
browser\u action
属性之前,需要在其上创建
BrowserAction
实例

// Create Manifest instance
Manifest newManifest = new Manifest();

Console.Writeline (newManifest.browser_action == null); // Print true;

// Instantiate BrowserAction on browser_action property
newManifest.browser_action = new BrowserAction();

Console.Writeline (newManifest.browser_action == null); // Print false;

// Now you can use browser_action property
newManifest.browser_action.default_popup = "popup.html";

将清单类更改为

public class Manifest
{
    public BrowserAction browser_action { get; set; }
    public Manifest()
    {
        browser_action = new BrowserAction();
    }
}

问题是属性浏览器\u操作从未初始化

为什么
browser\u action
有一个公共setter?它看起来像一个属性,应该在构造函数中初始化,然后再也不会更改。谢谢。让我一天都很愉快这么简单的事情花了我一天的时间才弄清楚到底出了什么问题。当你有经验的时候,你知道什么是错误的,但是当你是一个初学者的时候,它是困难的。