【问题标题】:Why is my Stopwatch not adding time?为什么我的秒表不加时间?
【发布时间】:2023-03-20 22:26:01
【问题描述】:

该类不会使用 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();
    }
}

【问题讨论】:

    标签: c# .net class static stopwatch


    【解决方案1】:

    您正在通过TimeSpan 呼叫AddTimeSpan 是一个 不可变 值类型。你对这里的结果什么都不做:

    sr.Elapsed.Add(ts);
    

    ...所以它实际上是一个空操作。即使TimeSpan 是不可变的,它仍然是一个值类型——因此您将获取属性值(这将创建一个副本),然后调用Add,然后变异的副本将丢失。

    基本上,你在这里尝试做的事情是行不通的。

    编辑:您的解决方法也不起作用,因为如果花费了 35 秒并且您增加了 30 秒,那么您最终将报告 65 秒而不是 1 分 5 秒。

    你应该只保留一个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);
        }
    }
    

    我对整体设计有点怀疑——特别是,所有这些没有尝试线程安全的静态让我紧张......你真的需要所有这些都是静态的吗?开始?

    【讨论】:

    • Even if TimeSpan were immutable 呃,你的意思是可变的?
    • 哦,我明白了。但仍然想不出一个血腥的解决方案。然而,我确实想出了一个便宜的,它的工作方式相同。我会发布它。
    • @user537156:你的解决方案有点破。我将进行编辑以提出替代方案...
    【解决方案2】:

    TimeSpan.Add() 不会修改现有值,而是返回一个新的结果 TimeSpan。所以你需要改变:

    sr.Elapsed.Add(ts);
    

    ...以便它实际上将结果存储在有用的地方。

    【讨论】:

    • 将结果存储在一个临时对象中,然后将其丢弃。
    • @Mud:它没有。作者需要在秒表之外处理该逻辑。
    • @MUd 你在说什么?我说 OP 需要将结果存储在有用的地方。我引用了他们当前的代码,而不是要更改的代码。请仔细阅读回复,尤其是在发布负面声誉之前。
    • @itsme86 明白了。除非您编辑答案,否则无法撤回我的投票。
    【解决方案3】:

    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方法 的合适名称。 property 更好的名称应该是 TimeElapsedTime

    【讨论】:

    • 他真正需要做的就是给他的班级一个TimeSpan 成员,将sr.Elapsed.Add(ts); 的结果放入其中,然后在GetTime 方法中引用它而不是StopWatch。 .
    【解决方案4】:

    http://msdn.microsoft.com/en-us/library/system.timespan.add.aspx

    Add 返回一个新的 TimeSpan 对象而不是改变现有的对象,并且由于 StopWatch.Elapsed 是只读的,我不知道您是否可以完成您正在尝试的操作

    【讨论】:

      【解决方案5】:

      这是我的解决方案...

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

      【讨论】:

        猜你喜欢
        • 2020-11-25
        • 2018-12-18
        • 2021-10-03
        • 1970-01-01
        • 2013-08-23
        • 1970-01-01
        • 2020-07-30
        • 1970-01-01
        相关资源
        最近更新 更多