为什么TimeSpan使用重复的TimeToTicks?

时间:2013-08-19 01:21:03

标签: c# .net

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);

4 个答案:

答案 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的重载接受天数(第二个构造函数可以使用)。