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();

どんな助けでも大歓迎です!

アップデート!!

ここで見つかったCHEAPソリューションは、同様の状況にある可能性のある皆さんを支援することです

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();
    }
}
4

5 に答える 5

7

に電話AddしていTimeSpanます。不変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);
    }
}

ただし、全体的な設計にはやや疑問があります-特に、スレッドセーフを試みないこれらすべての静的は私を緊張させます...そもそも、これらすべてを静的にする必要がありますか?

于 2012-05-01T20:12:47.207 に答える
1

StopWatch.ElapsedTimeSpan新しいオブジェクトを返します。そのオブジェクトを呼び出す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の適切な名前です。プロパティのより適切な名前は、単にまたはです。TimeElapsedTime

于 2012-05-01T20:15:00.953 に答える
1

TimeSpan.Add()は既存の値を変更しませんが、新しい結果のTimeSpanを返します。したがって、変更する必要があります。

sr.Elapsed.Add(ts);

...実際に結果を有用な場所に保存するため。

于 2012-05-01T20:15:04.290 に答える
0

http://msdn.microsoft.com/en-us/library/system.timespan.add.aspxを参照してください

Addは、既存のオブジェクトを変更するのではなく、新しいTimeSpanオブジェクトを返します。また、StopWatch.Elapsedは読み取り専用であるため、試行していることを実行できるかどうかはわかりません。

于 2012-05-01T20:14:59.190 に答える