我在“返回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;
}
}
}
此问题是由您的设置者调用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
,而不必担心会无休止地被回叫。
您将获得堆栈溢出异常,因为您的设置方法在没有结束条件的情况下递归调用自己,而当您执行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()
。相反,我认为验证这些值,并在必要时在其他地方重置它们更合适。也许在某种服务中,或者任何代码将这些属性设置为开头。