2012-05-01 3 views
0

클래스는 Speedrun.AddToTime (h, m, s)을 사용하여 스톱워치 시간에 추가하지 않습니다.스톱워치가 시간을 추가하지 않는 이유는 무엇입니까?

이유에 대한 단서가 없습니다!

class Speedrun 
    { 
     private static Stopwatch sr = new Stopwatch(); 

     public static void Go() 
     { 
      sr.Reset(); 
      sr.Start(); 
     } 

     public static string GetTime 
     { 
      get 
      { 
       return sr.Elapsed.Hours + "h " + sr.Elapsed.Minutes + "m " + sr.Elapsed.Seconds + "s"; 
      } 

     } 

     public static void AddToTime(int hours, int minutes, int seconds) 
     { 
      TimeSpan ts = new TimeSpan(hours, minutes, seconds); 
      sr.Elapsed.Add(ts); 

     } 

     public static void Stop() 
     { 
      sr.Stop(); 
     } 

     public static void Cont() 
     { 
      sr.Start(); 
     } 
    } 

매우 간단합니다. 변수 대신 클래스 이름을 사용하여 참조하고 있습니다. 여기에 표시된대로

Speedrun.Go(); 

도움이 될만한 정보가 있으면 알려주세요.

업데이트! 여기

싼 해결책은 당신에게 당신은 TimeSpanAdd를 호출하고있는 비슷한 상황

class Speedrun 
{ 
    private static Stopwatch sr = new Stopwatch(); 

    private static int addedhours = 0; 
    private static int addedminutes = 0; 
    private static int addedseconds = 0; 


    public static void Go() 
    { 
     sr.Reset(); 
     sr.Start(); 
     addedhours = 0; 
     addedminutes = 0; 
     addedseconds = 0; 
    } 

    public static string GetTime 
    { 
     get 
     { 
      return (sr.Elapsed.Hours + addedhours) + "h " + (sr.Elapsed.Minutes + addedminutes) + "m " + (sr.Elapsed.Seconds + addedseconds) + "s"; 
     } 

    } 

    public static void AddToTime(int hours, int minutes, int seconds) 
    { 
     addedhours = addedhours + hours; 
     addedminutes = addedminutes + minutes; 
     addedseconds = addedseconds + seconds; 

    } 

    public static void Stop() 
    { 
     sr.Stop(); 
    } 

    public static void Cont() 
    { 
     sr.Start(); 
    } 
} 

답변

7

가있을 수 있습니다 사람들을 돕는 것입니다. TimeSpan변경 불가능한 값 유형입니다. 여기에 결과로 아무 것도하지 않습니다.

sr.Elapsed.Add(ts); 

... 그래서 사실상 아무런 문제가 아닙니다. TimeSpan이 불변 인 경우에도 여전히 값 유형이므로 복사 할 속성 값을 가져온 다음 Add을 호출하면 변경된 복사본이 손실됩니다.

기본적으로 여기에서하려는 것은 실제로 작동하지 않습니다.

편집 : 35 초가 걸리고 30 초를 추가하면 1 분 5 초 대신 65 초가보고되므로 해결 방법이 제대로 작동하지 않습니다.

당신은 유지해야 단지 TimeSpan 추가, 당신은 같은 것을 사용할 수 있습니다

public static string GetTime 
{ 
    get 
    { 
     TimeSpan time = sr.Elapsed + timeToAdd; 
     // In .NET 4 you could use a custom format string for the TimeSpan 
     return string.Format("{0}h {1}m {2}s", 
          time.Hours, time.Minutes, time.Seconds); 
    } 
} 

내가 비록 전체적인 디자인의 다소 모호한 해요 - 특히, 어떤 시도도없이 모든 정적 스레드 -시를 안전은 나를 긴장하게 만든다 ... 정말로 이 모든 것을 정적으로 시작해야합니까?

+0

'TimeSpan이 변경 불가능한 경우에도 변경할 수 있습니까? – vcsjones

+0

오, 알겠습니다. 그러나 여전히 피투성이의 해결책을 찾아 낼 수는 없습니다. 그러나 나는 같은 것을 작동하는 값이 싼 하나를 생각해 냈습니다. 나는 그것을 게시 할 것이다. – JeremyC

+0

@ user537156 : 솔루션이 약간 손상되었습니다. 나는 대안을 제안하도록 편집 할 것이다 ... –

1

StopWatch.Elapsed이를 반환 노력하고 무엇을 달성 할 수 있을지 모르겠어요 새로운 TimeSpan 개체입니다. 해당 개체에서 Add을 호출하면 또 다른 TimeSpan 개체가 만들어지고 그 개체는 삭제됩니다.

귀하의 StopWatch 개체에는 아무 것도 쓰지 않습니다.

이 시도 :

class Speedrun 
{ 
    private static Stopwatch sr = new Stopwatch(); 
    private static TimeSpan elapsed = new TimeSpan(); 

    public static void Go() 
    { 
     elapsed = new TimeSpan(0); 
     sr.Reset(); 
     sr.Start(); 
    } 

    public static string GetTime 
    { 
     get 
     { 
      elapsed = elapsed.Add(sr.Elapsed); 
      return elapsed.Hours + "h " + elapsed.Minutes + "m " + elapsed.Seconds + "s"; 
     } 

    } 

    public static void AddToTime(int hours, int minutes, int seconds) 
    { 
     TimeSpan ts = new TimeSpan(hours, minutes, seconds); 
     elapsed = elapsed.Add(ts); 
    } 

    public static void Stop() 
    { 
     sr.Stop(); 
    } 

    public static void Cont() 
    { 
     sr.Start(); 
    } 
} 

참고로, GetTime방법에 대한 적절한 이름입니다.속성의 더 좋은 이름은 일 뿐이므로 Time 또는 ElapsedTime이됩니다.

+1

그가 정말로해야 할 일은 그의 수업에'TimeSpan' 회원에게'sr.Elapsed.Add (ts);'결과를 넣은 다음 그것을 참조하는 것이다. GetTime 메소드의 StopWatch 대신 ... –

1

TimeSpan.Add()는 기존 값을 수정하지 않지만 새로운 결과 TimeSpan을 반환합니다. 따라서 다음과 같이 변경해야합니다 :

sr.Elapsed.Add(ts); 

... 실제로 결과를 어딘가에 저장합니다.

+0

임시 객체에 결과를 저장 한 다음이를 버립니다. – Mud

+0

@ 머드 : ~하지 마세요. 제작자는 Stopwatch 외부의 논리를 처리해야합니다. –

+2

@Mud 무슨 말씀 이세요? 나는 OP가 어딘가 유용한 결과를 저장해야한다고 말했다. 나는 현재 코드를 인용하고 있었고 코드는 변경하지 않았습니다. 신중한 평판을 나눠주기 전에 특히 응답을주의 깊게 읽으십시오. – itsme86

관련 문제