main
class Program
{
static void Main(string[] args)
{
Worker worker = new Worker();
worker.Start();
Console.ReadLine();
}
}Worker类
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类
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类
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类调用它,它工作得很好:
public void Start()
{
ResetVariables();
Navigator.SetHtml();
Scraper.ReadHtmlFromNavigator();
}然后我得到了输出:
scraper reading html from navigator: navigator has changed its html发布于 2017-07-17 00:33:30
快速回答-不要在导航器中存储对导航器的引用,也不要在导航器中存储对导航器的引用。改为使用对Worker的引用。
在SetHtml方法中,调用Worker.Scraper.ReadHtmlFromNavigator()而不是Scraper.ReadHtmlFromNavigator()
更新:如果你不想每次都输入Woker.XXX,你可以创建一些快捷方式:
private Navigator Navigator { get { return Worker.Navigator; } }
private Navigator Scraper{ get { return Worker.Scraper; } }发布于 2017-07-17 00:33:39
在创建抓取器之前,您首先要构建一个新的导航器:
public void ResetVariables()
{
Navigator = new Navigator(this);
Scraper = new Scraper(this);
}因此,您的导航器构造函数将其scraper变量设置为一个尚不存在的worker.scraper。
简单地改变一下顺序,你就应该没问题了:
public void ResetVariables()
{
Scraper = new Scraper(this);
Navigator = new Navigator(this);
}不过,一般来说,请重新考虑如何设置应用程序。这种没有文档记录的强制性序列会产生问题,并且是一种代码气味。
https://stackoverflow.com/questions/45130838
复制相似问题