首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2个实例类尝试一起工作时引用为空

2个实例类尝试一起工作时引用为空
EN

Stack Overflow用户
提问于 2017-07-17 00:26:06
回答 2查看 27关注 0票数 0

main

代码语言:javascript
复制
class Program
{
    static void Main(string[] args)
    {
        Worker worker = new Worker();
        worker.Start();

        Console.ReadLine();
    }
}

Worker类

代码语言:javascript
复制
    public Worker()
    {

    }

    public Navigator Navigator;
    public Scraper Scraper;

    public void ResetVariables()
    {
        Navigator = new Navigator(this);
        Scraper = new Scraper(this);
    }

    public void Start()
    {
        ResetVariables();
        Navigator.SetHtml();
    }

Navigator类

代码语言:javascript
复制
    private Worker Worker;
    private Scraper Scraper;

    public string Html;

    public Navigator()
    {

    }

    public Navigator(Worker worker)
    {
        Worker = worker;
        Scraper = worker.Scraper;
    }

    public void SetHtml()
    {
        Html = "navigator has changed its html";
        Scraper.ReadHtmlFromNavigator(); //CAUSES NULL REFERENCE IF CALLED INISIDE THIS METHOD
    }

Scraper类

代码语言:javascript
复制
    private Worker Worker;
    private Navigator Navigator;

    public Scraper()
    {

    }

    public Scraper(Worker worker)
    {
        Worker = worker;
        Navigator = Worker.Navigator;
    }

    public void ReadHtmlFromNavigator()
    {
        Console.WriteLine("scraper reading html from navigator: " + Navigator.Html);
    }

当我从导航器内部调用Scraper.ReadHtmlFromNavigator()时,我得到了一个空引用,但是如果我从worker类调用它,它工作得很好:

代码语言:javascript
复制
public void Start()
    {
        ResetVariables();
        Navigator.SetHtml();
        Scraper.ReadHtmlFromNavigator();
    }

然后我得到了输出:

代码语言:javascript
复制
scraper reading html from navigator: navigator has changed its html
EN

回答 2

Stack Overflow用户

发布于 2017-07-17 00:33:30

快速回答-不要在导航器中存储对导航器的引用,也不要在导航器中存储对导航器的引用。改为使用对Worker的引用。

SetHtml方法中,调用Worker.Scraper.ReadHtmlFromNavigator()而不是Scraper.ReadHtmlFromNavigator()

更新:如果你不想每次都输入Woker.XXX,你可以创建一些快捷方式:

代码语言:javascript
复制
private Navigator Navigator { get { return Worker.Navigator; } }
private Navigator Scraper{ get { return Worker.Scraper; } }
票数 0
EN

Stack Overflow用户

发布于 2017-07-17 00:33:39

在创建抓取器之前,您首先要构建一个新的导航器:

代码语言:javascript
复制
public void ResetVariables()
{
    Navigator = new Navigator(this);
    Scraper = new Scraper(this);
}

因此,您的导航器构造函数将其scraper变量设置为一个尚不存在的worker.scraper。

简单地改变一下顺序,你就应该没问题了:

代码语言:javascript
复制
public void ResetVariables()
{
    Scraper = new Scraper(this);
    Navigator = new Navigator(this);
}

不过,一般来说,请重新考虑如何设置应用程序。这种没有文档记录的强制性序列会产生问题,并且是一种代码气味。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45130838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档