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

问题描述 投票:0回答:2

我在“返回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;
    }
}
}
c#
2个回答
1
投票

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

中断该周期。

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

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,而不必担心会无休止地被回叫。


1
投票

您将获得堆栈溢出异常,因为您的设置方法在没有结束条件的情况下递归调用自己,而当您执行TimeTwo = value;时,可以为每个公共属性创建一个私有支持属性,并在getter和setter中使用这些属性:

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()。相反,我认为验证这些值,并在必要时在其他地方重置它们更合适。也许在某种服务中,或者任何代码将这些属性设置为开头。

© www.soinside.com 2019 - 2024. All rights reserved.