2017-06-18 46 views
1

我寫了一個名爲stopwatch的類和它們的兩個方法(Start()和Stop())。每次我開始和停止時,我都應該得到TimeSpan的時間間隔。但每次運行它時,我都會得到TimeSpan 00:00:00。哪裏錯了? 這裏是我的代碼:C#中使用DateTime和TimeSpan的秒錶

class Stopwatch 
    { 
     private DateTime _start; 
     private DateTime _stop; 
     private bool _running; 

     public void Start() 
     { 
      if (!_running) 
      { 
       _running = true; 
       _start = DateTime.Now; 
      } 
     } 
     public TimeSpan Stop() 
     { 
      if (_running) 
      { 
       _stop = DateTime.Now; 
       _running = false; 
      } 
      return (_stop - _start); 
     } 

在main方法運行:

static void Main(string[] args) 
{ 
    Console.WriteLine("Stopwatch application"); 
    Console.WriteLine("tap 'y' to start,'n' to stop,'q' to quit."); 
    while (true) 
    { 
     Console.WriteLine("tap 'y' to start,'n' to stop,'q' to quit."); 
     var input = Console.ReadLine(); 
     var stopWatch = new Stopwatch(); 
     if (input == "y") 
     { 
      Console.WriteLine("start"); 
      stopWatch.Start(); 
     } 
     if (input == "n") 
     { 
      Console.WriteLine("stop"); 
      Console.WriteLine(stopWatch.Stop().ToString("G")); 
     } 
     if (input == "q") break; 
    } 
} 

一個解決方法我試過,通過Cosole.ReadLine()替換所有的輸入,效果很好。但是我的原始代碼出錯了?這意味着_running總是false當你調用Stop -

回答

10

你在每次迭代產生的Stopwatch一個新的實例。

另外:

  • 您應該使用的DateTime.UtcNow代替DateTime.Now,否則,你會看到一個-1小時或1小時的「變化」,如果DST開始或結束
  • 你不完全需要您的Stopwatch課程 - 您應該使用System.Diagnostics.Stopwatch代替。這通常具有更高的精度,並且不會受到改變系統時鐘的事情的影響。它正是爲這種事情設計的。

因此,像(在幾個地方調整風格):

var stopwatch = new Stopwatch(); 
while (true) 
{ 
    Console.WriteLine("Tap 'y' to start, 'n' to stop, or 'q' to quit."); 
    switch (Console.ReadLine()) 
    { 
     case "y": 
      Console.WriteLine("start"); 
      // Resets *and* starts if necessary 
      stopwatch.Restart(); 
      break; 
     case "n": 
      Console.WriteLine("stop"); 
      stopwatch.Stop(); 
      Console.WriteLine(stopWatch.Elapsed); 
      break; 
     case "q": 
      return; 
    } 
} 
-1
static void Main(string[] args) 
{ 
    Console.WriteLine("Stopwatch application"); 
    Console.WriteLine("tap 'y' to start,'n' to stop,'q' to quit."); 
    var stopWatch = new Stopwatch(); 
    while (true) 
    { 
     Console.WriteLine("tap 'y' to start,'n' to stop,'q' to quit."); 
     var input = Console.ReadLine(); 

     if (input == "y") 
     { 
      Console.WriteLine("start"); 
      stopWatch.Start(); 
     } 
     if (input == "n") 
     { 
      Console.WriteLine("stop"); 
      TimeSpan temp = stopWatch.Stop(); 
      Console.WriteLine("{0:D2}:{1:D2}:{2:D2}", temp.Hours, temp.Minutes, temp.Seconds); 
     } 
     if (input == "q") break; 
    } 
} 

我希望它會爲你工作。