为什么TimeSpan使用重复的TimeToTicks
本文关键字:TimeToTicks TimeSpan 为什么 | 更新日期: 2023-09-27 18:28:03
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);
?
我猜它是由两个或更多不同的人编写的,没有人发现代码中的不一致。
此外,第一个不使用重载TimeSpan(days, hours, minutes, seconds, 0)
,因为days
没有值。
但是,您是正确的,它可以使用重载TimeSpan(0, hours, minutes, seconds, 0)
。
正如Karl Anderson所说,这可能是由于多个程序员和缺乏代码审查。但它也可能是故意的,为第一种情况提供较小的性能提升。如果我正确阅读代码,则会保存两个乘法和两个加法。
编辑:只是出于好奇,你有没有试过查看不同版本的.Net Framework?Mono的框架怎么样?
它似乎是特定于实现的。在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 位精度添加到 _ticks
.对于没有毫秒的时间跨度,TimeToTicks
更有效,可能就足够了。也许真正的问题是为什么没有接受天数的TimeToTicks
重载(第二个构造函数可以使用(。