我有一个问题,在添加此代码后,我可以在Downloader类中访问我的MainWindow控件:
public partial class MainWindow : Form
{
private Downloader fileDownloader;
public MainWindow()
{
InitializeComponent();
fileDownloader = new Downloader(this);
}
//smth
}
和
class Downloader : MainWindow
{
private MainWindow _controlsRef;
public Downloader(MainWindow _controlsRef)
{
this._controlsRef = _controlsRef;
}
// smth
}
它现在给了我“在System.Windows.Forms.dll上发生了'System.StackOverflowException'类型的未处理异常”
this.mainControlPanel.ResumeLayout(false);
MainWindow.Designer.cs中的。如果我注释掉上面的代码,它可以正常工作。有什么想法吗?
PS。此外,当我在Downloader类时,我应该访问像
这样的控件textbox.Text
或
_controlsRef.textbox.Text
两者似乎都没有编译错误,两者之间有什么区别吗?
答案 0 :(得分:3)
您的Downloader
班级继承了MainWindow
。当您对其进行实例化时,根据C#规范,首先初始化基类。当MainWindow
初始化时,它会创建一个Downloader
的新实例,这会使它最终成为stackoverflow,因为你处于无限循环依赖中。
由于Downloader
继承了MainWindow
,因此通过构造函数获取它的实例是没有意义的。您只需从派生的protected
和public
成员访问它。
例如:
public partial class MainWindow : Form
{
protected string Bar { get; set; }
public MainWindow()
{
Bar = "bar";
InitializeComponent();
}
}
public class Downloader : MainWindow
{
public void Foo()
{
// Access bar:
Console.WriteLine(Bar);
}
}
答案 1 :(得分:1)
这是问题,因为在这里你有循环依赖,即两种方法都在等待彼此完成。
检查
public MainWindow()
{
InitializeComponent();
fileDownloader = new Downloader(this);//this wait to complete downloader intialization
}
public Downloader(MainWindow _controlsRef)//this wait to complete mainwindow first
{
this._controlsRef = _controlsRef;
}
我的意思是说,你从MainWindow继承Downloader,在构造函数caging downloader instace ...并且下载器首先调用Mainwindow构造函数,因为它的父包装问题在这里 溶液
如果想要参考,你可以这样做
public partial class MainWindow : Form
{
protected MainWindow mainWindow;
public MainWindow()
{
InitializeComponent();
mainWindow = this;
}
//smth
}
class Downloader : MainWindow
{
public Downloader()
{
//this.mainWindow //will give you reference to main winsow
}
// smth
}