2011-11-14 24 views
2

我在While循环中运行一些代码:如何正确编写此功能?它给我的内存不足每次

while (Time <= EndPeriod) 
{ 
     ... code ... 

     Tine.AddTime(Time); 
} 

我遇到的问题就是Time.AddTime(时间)执行它创建内存泄漏。 AddTime函数检查类属性,并通过基于交换器中DateFormat变量的正确方法(例如AddDays,AddMonths等)添加时间。如果我把开关放到循环中一切都很好,但是如果我尝试引用这个函数,它会发生堆栈溢出。

我录入时间函数如下所示:

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

什么可能我是做错了什么?

感谢

+1

你真的有两个不同的属性/领域'Tine'和'Time'? ('Tine.AddTime(Time);') – sll

+0

内存不足,呃?你在哪里给“EndPeriod”价值?另外,什么是'DatePart'?似乎我们在这里没有全貌。为什么你永远不会回到'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 <= EndPeriod)将传递的Time值将改变永远。

所有方法如DateTime.AddYears()DateTime.AddDays()不会修改对象本身的值,但会返回新值。

MSDN:

此方法不改变此DateTime对象的值。 而是它返回一个新的DateTime对象,其值是 此操作的结果。

+0

谢谢你的工作。 – Darren

+0

'Tine.AddTime(Time)'也一样 –

0

堆栈可能会从多个DateTime分配中溢出。尝试移动循环&以外的日期时间不断覆盖它。

这里的想法是,B/C日期时间分配给堆栈而不是堆,它可能会导致调整thead(while循环)溢出。

0

(假设上的代码输入错误,在这里纠正它...

Time.AddTime(Time); 

这是否修改Time?看起来不像它,至少不直观。如果你不改变的值的Time则循环会无休止地运行,从未达到其终止条件尝试指派返回值:

Time = Time.AddTime(Time); 

此外,如果您使用的东西,像myTime.AddYears()和类似的方法,该方法的里面,你需要将其返回值分配给您的变量。

作为设计的一般问题,您应该小心使用哪种方法修改哪些对象。我承认DateTime上的.AddXX()方法在这方面不是很直观。