我在While循环中运行了一些代码:
while (Time <= EndPeriod)
{
... code ...
Tine.AddTime(Time);
}
我遇到的问题是Time.AddTime(Time)执行它会造成内存泄漏。 AddTime函数检查一个类属性,并根据交换机中的DateFormat变量通过正确的方法(例如AddDays,AddMonths等等)添加时间。如果我把开关放到循环中一切都很好,但是如果我尝试引用这个函数就会发生堆栈溢出。
我的AddTime功能如下:
protected DateTime AddTime(DateTime Time)
{
DateTime myTime = Time;
switch (DatePart) {
case "yy":
myTime.AddYears(1);
break;
case "qq":
myTime.AddDays(1);
break;
case "mm":
myTime.AddMonths(1);
break;
case "dd":
myTime.AddDays(1);
break;
case "hh":
myTime.AddHours(1);
break;
case "ss":
myTime.AddSeconds(1);
break;
default:
myTime.AddMinutes(1);
break;
}
return myTime;
}
我可能做错了什么?
由于
答案 0 :(得分:3)
你应该改变:
myTime.AddSeconds(1);
到
// The same for all other methods which considered to modify
// a DateTime value including your custom AddTime() method
myTime = myTime.AddSeconds(1);
以这种方式条件Time
的值会发生变化,因此您有可能会传递条件(Time <= EndPeriod)
。
DateTime.AddYears() DateTime.AddDays()等所有方法都不会修改对象本身的值,但会返回新值。
MSDN:
此方法不会更改此DateTime对象的值。 相反,它返回一个新的DateTime对象,其值是结果 这个操作。
答案 1 :(得分:0)
堆栈很可能是从众多DateTime分配中溢出的。尝试将DateTime移动到循环外部。不断覆盖它。
这里的想法是b / c DateTime被分配给堆栈而不是堆,它可能导致caling thead(while循环)溢出。
答案 2 :(得分:0)
(假设代码上有拼写错误并在此纠正...
Time.AddTime(Time);
这会修改Time
吗?看起来不像,至少不直观。如果你没有改变Time
的值,那么循环将无休止地运行,永远不会达到其终止条件。尝试指定返回值:
Time = Time.AddTime(Time);
此外,在使用myTime.AddYears()
等方法和其他此类方法的方法内部,您还需要将其返回值分配给变量。
作为设计的一般问题,您应该注意哪些方法可以修改哪些对象。我承认.AddXX()
上的DateTime
方法在这方面不是很直观。