C# 设置变量时堆栈溢出

C# 设置变量时堆栈溢出,c#,mef,C#,Mef,我正在使用MEF框架编写一个程序来创建插件。当试图在其中一个插件中设置变量时,我得到了一个堆栈溢出异常 插件中的变量定义为公共字符串bnick{get{return bnick;}set{bnick=value;}} 主程序中的调用代码: public void SetUpPlugins() { foreach (Plugin p in plugins) { p.bnick = nick;

我正在使用MEF框架编写一个程序来创建插件。当试图在其中一个插件中设置变量时,我得到了一个堆栈溢出异常

插件中的变量定义为
公共字符串bnick{get{return bnick;}set{bnick=value;}}

主程序中的调用代码:

 public void SetUpPlugins()
        {
        foreach (Plugin p in plugins)
            {
            p.bnick = nick;
            p.HostProgram = this;
            }
        }
使用调试器,我确定行
p.bnick=nick
只被调用一次。它永远不会到达下一行

为什么这会填满堆栈?如何修复

public string bnick {get {return bnick;} set {bnick = value;}} 
在这里,您再次在setter的主体中分配
b单击
,从而创建堆栈溢出。您是否打算创建一个实例变量,比如

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

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

问题是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; }

为什么这值+1?由于使用IDE,因此不需要表示成员变量,而且,它与C#.@Femaref的样式指南相反,因为它更清晰。我喜欢按住CTRL键并滚动代码,而不是过度使用鼠标。还有,link,然后我会相信你。指导原则说属性应该是PascalCase,然后支持字段可以是camelCase,或者使用auto属性省略。@Femaref你当然是对的(+1 btw)。我不会在自己的代码中这样写,除非出于某种原因我必须这样做。我只是建议这是解决OP问题所需的最小更改量(重命名公共属性需要更新所有引用)@p.s.w.g:我不是在批评你-我是在批评下划线是向上投票的原因(也不是向下投票的原因)。谢谢,我讨厌犯这样的简单错误