C#吸气剂/塞特剂对

C#吸气剂/塞特剂对,c#,getter-setter,C#,Getter Setter,我正试图用下面的getter和setter创建一个属性I。我试过: int i { get{ return i; } set { if (value > 60) { } else { i = value; } } } 但是,当我尝试此操作时,当我尝试运行代码时,会出现

我正试图用下面的getter和setter创建一个属性I。我试过:

    int i { 
        get{
            return i;   
        }
        set {
            if (value > 60) {
            } else { 
                i = value; 
            } 
        }

    }

但是,当我尝试此操作时,当我尝试运行代码时,会出现堆栈溢出错误。我的代码有什么问题吗?任何助手都将不胜感激

如果您的属性中有任何类型的逻辑(否则,自动属性就是最好的选择)——当前您正在为属性本身赋值,该属性再次调用setter代码(对于getter也是如此)——这会导致Stackoverflow异常

例如:

private int _i;
public int SomeProperty
{
  get{ return _i;}
  set 
  {
     //your logic here
     _i = value; 
  }
}
这样做:

private int i; // backing field

int I
{ 
    get
    {
        return i;   
    }
    set
    {
        if (value > 60) {
        } else
        { 
            i = value; 
        } 
    }
}
如果不这样做,代码将保持循环状态,因此出现
StackOverflow
错误。

就是这样

private int i = 0;
public int I
{
    get
    {
        return i;
    }
    set
    {
        if (value > 60)
        {
        }
        else
        {
            i = value;
        }
    }
}
请遵循一些编码命名约定

  • 属性与MyProperty类似
  • 私有字段的大小写类似于本地变量

  • 要了解更多信息,请使用以下代码:

    int i;
    
    public int I 
    { 
        get { return i; }
        set { if (value <= 60) i = value; } 
    }
    
    inti;
    公共int I
    { 
    获取{return i;}
    设置{if(值
    在上面的代码中,在get和set块中使用相同的属性名

    编译后,您的代码将被翻译成与以下内容等效的内容:

    int get_i()
    {
     return get_i();
    }
    
    void set_i(int value)
    {
     set_i(value);
    }
    
    正如您所看到的,它们中的每一个都将无限地调用自身(递归),而没有任何退出条件,从而导致
    StackOverflow
    异常

    如果属性有一个支持字段,就像这个问题的其他答案所建议的那样,编译器将生成与此等价的东西,它没有递归:

    int get_i()
    {
     return _i; //_i is the backing field
    }
    
    void set_i(int value)
    {
     _i = value;
    }
    
    更新:

    为了完整起见,我在这里添加了一种解决您的问题的方法

    int _i;
    int i { 
        get{
            return _i;   
        }
        set {
            if (value > 60) {
            } else { 
                _i = value; 
            } 
        }
    }
    
    int _i;
    int i { 
        get{
            return _i;   
        }
        set {
            if (value > 60) {
            } else { 
                _i = value; 
            } 
        }
    }