我正在使用MEF框架编写一个程序来创建插件。当尝试在其中一个插件中设置变量时,我收到了堆栈溢出异常。
插件中的变量定义为public string bnick {get {return bnick;} set {bnick = value;}}
主程序中的调用代码:
public void SetUpPlugins()
{
foreach (Plugin p in plugins)
{
p.bnick = nick;
p.HostProgram = this;
}
}
使用调试器我确定只调用一次p.bnick = nick
行。它永远不会到达下一行。
为什么这会填满堆栈,我该如何解决?
答案 0 :(得分:3)
public string bnick {get {return bnick;} set {bnick = value;}}
在这里,您再次在setter的主体中分配bnick
,从而创建堆栈溢出。您是否打算创建一个实例变量,例如
private string bnick = "";
public string Bnick
{
get
{
return bnick;
}
set
{
bnick = value;
}
}
注意:在C#中,惯例是在PascalCase中写入属性。
答案 1 :(得分:1)
问题是你的getter和setter是递归调用的。试试这个:
private string _bnick;
public string bnick
{
get { return this._bnick; }
set { this._bnick = value; }
}
或者更简单地说,使用Auto-Implemented Properties来避免此类问题:
public string bnick { get; set; }
正如 Femaref 指出的那样,要遵循C#的编码指南,它应该如下所示:
public string Bnick { get; set; }