C# getter/setter对

3

我尝试创建一个具有以下getter和setter的属性i。我已经尝试了:

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

    }

然而,当我尝试运行这段代码时,会出现堆栈溢出错误。我的代码有什么问题吗?希望能得到帮助。
5个回答

5
如果您的属性中有任何逻辑(否则应该使用自动属性),则需要一个后备字段 - 目前您正在将其分配给属性本身,这会再次调用您的setter代码(getter也是如此) - 这会导致 Stackoverflow 异常。
示例:
private int _i;
public int SomeProperty
{
  get{ return _i;}
  set 
  {
     //your logic here
     _i = value; 
  }
}

4

请执行以下操作:

private int i; // backing field

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

如果您不这样做,您的代码将保持循环状态,因此会出现 StackOverflow 错误。

2

这就是这样

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

请遵循一些编码命名约定:

  1. 属性采用PascalCase命名,例如MyProperty
  2. 私有字段采用camelCase命名,例如localVariable

更多信息请参考这里


1

只需要使用这段代码:

int i;

public int I 
{ 
    get { return i; }
    set { if (value <= 60) i = value; } 
}

您代码中的问题在于您在属性中指定了“i”,而该属性在getter/setter函数体内引用了自身,导致循环效应,并最终出现了堆栈溢出错误。

1
int i { 
    get{
        return i;   
    }
    set {
        ...
        i = value; 
        ...
    }
}

在您上面的代码中,您在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; 
        } 
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接