为什么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使用重复的TimeToTicks

我猜它是由两个或更多不同的人编写的,没有人发现代码中的不一致。

此外,第一个不使用重载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重载(第二个构造函数可以使用(。