我在“返回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;
}
}
}
答案 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
,而不必担心会无休止地被回呼。