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

任何帮助将不胜感激!

更新!!

在这里找到的廉价解决方案是为了帮助可能有类似情况的人

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 秒,那么您最终将报告 65 秒而不是 1 分 5 秒。

您应该只保留 aTimeSpan添加,然后您可以使用以下内容:

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.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方法的适当名称。一个更好的属性名称应该是Timeor ElapsedTime

于 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 回答
0

这是我的解决方案...

public class StopwatchPlus : Stopwatch
{
    private TimeSpan AddedTime { get; set; }
    public StopwatchPlus() { AddedTime = new TimeSpan(0); }
    public TimeSpan Elapsed { get { return base.Elapsed.Add(AddedTime); } }
    public void Add(TimeSpan time) { AddedTime = AddedTime.Add(time); }
}
于 2018-06-30T12:50:23.727 回答