2017-06-18 15 views
1

ストップウォッチと呼ばれるクラスとその2つのメソッド(Start()とStop())を記述します。開始と終了のたびに、私はその時間間隔のTimeSpanを取得する必要があります。しかし、私がそれを実行するたびに、私は常にTimeSpan 00:00:00を取得します。どこが間違っていますか?ここ は私のコードです:DateTimeとTimeSpanを使用したC#のストップウォッチ

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(ですべての入力を置き換える、です)、それがうまく動作します。しかし、元のコードはどこが間違っていますか?あなたがStopを呼び出すとき_running常にfalseをすることを意味する -

答えて

10

あなたは、各反復でStopwatchの新しいインスタンスを作成しています。また

:あなたはDSTが開始または終了した場合そうあなたが

  • あなたがいない-1時間か1時間の「変更」を参照してくださいよ、DateTime.UtcNow代わりDateTime.Nowを使用する必要があります
    • 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; 
        } 
    } 
    

    私はそれがあなたのために働くことを願っています。

    関連する問題