为什么我的秒表没有增加时间?

Jer*_*myC 0 .net c# static class stopwatch

该课程不会使用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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

相当简单,我使用类名本身而不是变量来引用它.如此处所见

Speedrun.Go();
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

UPDATE!

在这里找到的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

你正在呼唤Add一个TimeSpan.TimeSpan是一个不可变的值类型.你在这里没有做任何结果:

sr.Elapsed.Add(ts);
Run Code Online (Sandbox Code Playgroud)

......所以它实际上是一个无操作.即使它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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我对整体设计有点怀疑 - 特别是所有这些静态而没有任何线程安全的尝试让我感到紧张......你真的需要所有这些都是静态的吗?