如何正确编写此功能?它每次都让我内存不足

时间:2011-11-14 21:18:54

标签: c# datetime while-loop stack-overflow

我在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;
}

我可能做错了什么?

由于

3 个答案:

答案 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方法在这方面不是很直观。