3

我正在编写一个使用 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只被调用一次。而且它永远不会进入下一行。

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

4

2 回答 2

3
public string bnick {get {return bnick;} set {bnick = value;}} 

在这里,您bnick再次在 setter 的主体中进行分配,从而创建了堆栈溢出。您是否打算创建一个实例变量,例如

private string bnick = "";
public string Bnick 
{
  get 
  { 
   return bnick;
  } 
  set 
  { 
    bnick = value;
  }
} 

注意:在 C# 中,约定是用 PascalCase 编写属性。

于 2013-06-29T20:51:03.480 回答
1

问题是你的 getter 和 setter 递归地调用自己。尝试这个:

private string _bnick;
public string bnick 
{ 
    get { return this._bnick; }
    set { this._bnick = value; }
}

或者更简单地说,使用自动实现的属性来避免这种问题:

public string bnick { get; set; }

正如Femaref指出的那样,要遵循 C# 的编码准则,它应该如下所示:

public string Bnick { get; set; }
于 2013-06-29T20:51:21.310 回答