在彼此的get属性中处理多个值

时间:2019-11-27 21:31:01

标签: c#

我在“返回TimeOne”上遇到StackOverflow异常。
Timecheck方法根据在任何给定时间的值设置两个值。有没有一种方法可以在一开始就基于彼此处理两个值?

 class Name
{
 private string _Timeone
  public string TimeOne
 {
       get
        {
           return _Timeone
        }


        set
        {
          TimeCheck();
          _Timeone = value;
        }
  }

 private string _TimeTwo
 public string TimeTwo
  {
       get
        {
            return _TimeTwo
        }

        set
        {
            TimeCheck();
            _TimeTwo= value;
        }
  }


    private void TimeCheck()
    {
           string WrongTime = "....";
        if (TimeOne == WrongTime  && TimeTwo == WrongTime )
                TimeOne = TimeTwo = DateTime.Now.ToString();
            else if (TimeOne == WrongTime) TimeOne = TimeTwo 
            else if TimeTwo == WrongTime) TimeTwo = TimeOne;
    }
}
}

2 个答案:

答案 0 :(得分:2)

您将收到堆栈溢出异常,因为您的设置者在进行TimeTwo = value;时会无条件递归地调用自己,相反,您可以为每个公共属性创建一个私有支持属性,并在getter中使用它们和二传手:

private string _timeOne;
private string _timeTwo;

public string TimeOne
{
    get { return _timeOne; }
    set
    {
        TimeCheck();
        _timeOne = value;
    }
}

public string TimeTwo
{
    get { return _timeTwo; }
    set
    {
        TimeCheck();
        _timeTwo = value;
}

在当前的实现中,每次您说TimeOne = value;时,将再次调用设置器,然后再次调用它,依此类推。

编辑

我同意不应在设置者中调用TimeCheck()。相反,我认为验证这些值并在必要时在其他地方重置它们会更合适。也许在某种服务中,或者任何代码将这些属性设置为开始。

答案 1 :(得分:2)

此问题是由您的设置者调用TimeCheck引起的,而设置者又调用了设置者,其又引起了TimeCheck的恶心。

打破那个循环。

您的TimeCheck函数可以重写,因此它可以设置后备字段,而不用调用setter:

private void TimeCheck()
{
    string WrongTime = "....";
    if (_TimeOne == WrongTime  && _TimeTwo == WrongTime )
    {
        _TimeOne = _TimeTwo = DateTime.Now.ToString();
    }
    else if (_TimeOne == WrongTime) 
    {
        _TimeOne = _TimeTwo;
    }
    else if (_TimeTwo == WrongTime)
    {
        _TimeTwo = _TimeOne;
    }
}

这打破了循环。您的二传手现在可以致电TimeCheck,而不必担心会无休止地被回呼。