设置变量时堆栈溢出

时间:2013-06-29 20:48:11

标签: c# mef

我正在使用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行。它永远不会到达下一行。

为什么这会填满堆栈,我该如何解决?

2 个答案:

答案 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; }