使用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();
非常感谢任何帮助!
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();
}
}
答案 0 :(得分:7)
您正在Add
上致电TimeSpan
。 TimeSpan
是不可变的值类型。你在这里没有做任何结果:
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);
}
}
我对整体设计有些怀疑 - 特别是所有这些静态而没有任何线程安全的尝试让我感到紧张......你真的需要所有这些都是静态的开始?
答案 1 :(得分: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
。
答案 2 :(得分:1)
TimeSpan.Add()不会修改现有值,但会返回新的结果TimeSpan。所以你需要改变:
sr.Elapsed.Add(ts);
...所以它实际上将结果存储在有用的地方。
答案 3 :(得分:0)
请参阅http://msdn.microsoft.com/en-us/library/system.timespan.add.aspx
添加返回一个新的TimeSpan对象,而不是改变现有的,并且由于StopWatch.Elapsed是readonly,我不知道你是否可以完成你正在尝试的东西
答案 4 :(得分: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); }
}