TimeSpan有以下构造函数。
public TimeSpan(int hours, int minutes, int seconds)
{
this._ticks = TimeSpan.TimeToTicks(hours, minutes, seconds);
}
public TimeSpan(int days, int hours, int minutes, int seconds)
{
this = new TimeSpan(days, hours, minutes, seconds, 0);
}
public TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds)
{
long num = ((long)days * 3600L * 24L + (long)hours * 3600L + (long)minutes * 60L + (long)seconds) * 1000L + (long)milliseconds;
if (num > 922337203685477L || num < -922337203685477L)
{
throw new ArgumentOutOfRangeException(null, Environment.GetResourceString("Overflow_TimeSpanTooLong"));
}
this._ticks = num * 10000L;
}
internal static long TimeToTicks(int hour, int minute, int second)
{
long num = (long)hour * 3600L + (long)minute * 60L + (long)second;
if (num > 922337203685L || num < -922337203685L)
{
throw new ArgumentOutOfRangeException(null, Environment.GetResourceString("Overflow_TimeSpanTooLong"));
}
return num * 10000000L;
}
我认为TimeToTicks只是最后一个构造函数的简化版本。
为什么第一个不使用this = new TimeSpan(0, hours, minutes, seconds, 0);
?
答案 0 :(得分:1)
我的猜测是由两个人或更多人写的,没有人发现代码中的不一致。
此外,第一个不使用重载TimeSpan(days, hours, minutes, seconds, 0)
,因为days
没有值。
但是,你是正确的,它可以使用重载TimeSpan(0, hours, minutes, seconds, 0)
。
答案 1 :(得分:1)
正如Karl Anderson所说,这可能是由于多个程序员和缺乏代码审查。但它也可能是故意的,为第一种情况提供较小的性能提升。如果我正确读取代码,则会保存两次乘法和两次加法。
编辑:出于好奇,您是否尝试过查看.Net Framework的不同版本? Mono的框架怎么样?
答案 2 :(得分:1)
它似乎是特定于实现的。在Mono中,它有以下实现。
public TimeSpan (long ticks)
{
_ticks = ticks;
}
public TimeSpan (int hours, int minutes, int seconds)
{
CalculateTicks (0, hours, minutes, seconds, 0, true, out _ticks);
}
public TimeSpan (int days, int hours, int minutes, int seconds)
{
CalculateTicks (days, hours, minutes, seconds, 0, true, out _ticks);
}
public TimeSpan (int days, int hours, int minutes, int seconds, int milliseconds)
{
CalculateTicks (days, hours, minutes, seconds, milliseconds, true, out _ticks);
}
答案 3 :(得分:0)
我同意这可以用较少的重复编写,但这些方法并不完全重复。接受毫秒的构造函数将3位精度添加到_ticks
。对于没有毫秒的TimeSpans,TimeToTicks
更有效,可能就足够了。也许真正的问题是为什么没有TimeToTicks
的重载接受天数(第二个构造函数可以使用)。