在c#中,使用tick和原样比较两个日期有什么区别?

本文关键字:两个 日期 区别 什么 比较 使用 tick | 更新日期: 2023-09-27 18:06:19

我是c#新手。当我在检查之前为我的项目工作的人写的一些代码时,我遇到了这个:

if (olderTime.happenedWhen.Ticks > happenedWhen.Ticks)
{
   thisIsTrulyNew = false;
}

olderTime.happenedWhenhappenedWhen均为DateTime型。

这是比较DateTime的更准确的方法吗?

我知道Ticks表示从0001年1月1日00:00开始的100纳秒间隔。但是为什么要做这种比较呢?我认为我们可以这样做:

if (olderTime.happenedWhen > happenedWhen){
   thisIsTrulyNew = false
}

刻度比较是否实现了正常比较无法实现的功能?

在c#中,使用tick和原样比较两个日期有什么区别?

这是比较DateTime的更准确的方法吗?

一点也不。实际上,这就是>操作符在内部实现的方式。

来自。net参考源代码:

public static bool operator >(DateTime t1, DateTime t2) {
    return t1.InternalTicks > t2.InternalTicks;
}

有人可能认为他们跳过一行内部代码并直接进入Ticks属性是聪明的。实际上,Ticks的getter返回InternalTicks,因此,除非编译器对其进行了优化,否则使用Ticks属性会增加两个调用以节省一个调用(这两种方法都不会显著改变性能)。

operator >对于DateTime的实现也比较了刻度,正如您可以从这个反汇编代码(mscorlib.dll, System. dll)中看到的那样。DateTime类):

[__DynamicallyInvokable]
public long Ticks
{
    [__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    get
    {
        return this.InternalTicks;
    }
}
[__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool operator >(DateTime t1, DateTime t2)
{
    return t1.InternalTicks > t2.InternalTicks;
}

>操作符的实现如下:

public static bool operator >(DateTime t1, DateTime t2)
{
   return t1.InternalTicks > t2.InternalTicks;
}

所以它实际上是一样的(因为Ticks返回InternalTicks)。

源代码显示:

    public static bool operator >(DateTime t1, DateTime t2) {
        return t1.InternalTicks > t2.InternalTicks;
    }

    internal Int64 InternalTicks {
        get {
            return (Int64)(dateData & TicksMask);
        }
    }

其中dateData在构造函数中设置,简单地引用dateData = (UInt64)ticks;, TicksMask

private const UInt64 TicksMask = 0x3FFFFFFFFFFFFFFF;

这是一回事。在源代码中,>操作符定义为:

public static bool operator >(DateTime t1, DateTime t2) 
{
      return t1.InternalTicks > t2.InternalTicks;
}
为完整起见,Ticks属性定义为:
public long Ticks
{
        get 
        { 
            return InternalTicks; 
        }
}