1

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

4 回答 4

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);
    }
于 2013-08-19T02:38:07.917 回答
1

正如卡尔安德森所说,这可能是由于多个程序员和缺乏代码审查。但它也可能是故意的,为第一种情况提供较小的性能提升。如果我正确阅读了代码,则保存了两个乘法和两个加法。

编辑:出于好奇,您是否尝试过查看不同版本的 .Net 框架?Mono 的框架怎么样?

于 2013-08-19T02:12:32.900 回答
1

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

此外,第一个不使用重载TimeSpan(days, hours, minutes, seconds, 0),因为 没有值days

但是,您是正确的,它可以使用重载TimeSpan(0, hours, minutes, seconds, 0)

于 2013-08-19T01:38:07.767 回答
0

我同意这可以用更少的重复来编写,但这些方法并不完全重复。接受毫秒的构造函数将 3 位精度添加到_ticks. 对于没有毫秒的 TimeSpan,TimeToTicks效率更高,可能就足够了。也许真正的问题是为什么没有TimeToTicks接受天数的重载(第二个构造函数可以使用)。

于 2013-08-19T02:40:05.793 回答