相关属性:如何避免无限循环

时间:2014-06-16 06:21:37

标签: c# infinite-loop

我有一个Cube类。可以约束多维数据集以便width=height=length。我编写了这个功能,但正如您所看到的,我的代码会产生循环/无限循环 - the width sets the height which sets the width which sets the height and so on

如何限制我的Cube类并避免这种无限循环?我唯一的解决方案是使用布尔变量propagate(见下文)?

public class Cube {

    public bool isConstrained {get; set;} // if constrained then width=height=length

    // Causes a circular problem. How can I avoid this? Maybe create a variable private bool propagate = false; ??
    public double width
    {
        get { return width;  } 
        set 
        { 
            width  = value; 
            if (isConstrained) 
            {
                 height = value;
                 length = value; 
            }  
        } 
    }

    public double height
    { 
        get { return height;  } 
        set 
        {   
             height  = value; 
             if (isConstrained) 
             { 
                 width = value;
                 length = value; 
             } 
        } 
    }

    public double length
    {
         get { return length;  }
         set
         { 
              length  = value;  
              if (isConstrained) 
              { 
                  height = value; 
                  width = value; 
              } 
         } 
    }
}

我唯一的解决方案是:

private bool propagate = true;

public double length
{
    get { return length;  } 
    set 
    {
         length  = value; 
         if (isConstrained && propagate) 
         { 
             propagate = false;
             height = value; 
             width = value; 
             propagate = true;
         }
    }
}

2 个答案:

答案 0 :(得分:4)

目前,即使只是你的getter会给堆栈溢出 - 你没有任何字段支持你的数据,因为你没有使用自动实现的属性。此外,您的属性没有传统名称,这绝对值得修复。

您应该使用私有字段来支持属性,并在属性设置器中相应地设置它们。那样的话,没有一个属性可以调用另一个属性,一切都会很好......除了设计开始时有点麻烦。 (当改变一个属性改变另一个属性时,这可能会令人惊讶。)

类似于:

private int width;
private int height;
private int length;
private bool constrained;
...

public int Width
{
    get { return width; }
    set
    {
        width = value;
        if (constrained)
        {
            height = value;
            length = value;
        }
    }
}

答案 1 :(得分:3)

立方体的长度,宽度和高度是否应该相同?您可以使用单个私有变量来保存长度,宽度和高度,然后在设置任何这些属性时,将该值分配给私有变量。在get Properties中为宽度/高度/长度返回相同变量的值。