在c#中,使用tick和原样比较两个日期有什么区别?
本文关键字:两个 日期 区别 什么 比较 使用 tick | 更新日期: 2023-09-27 18:06:19
我是c#新手。当我在检查之前为我的项目工作的人写的一些代码时,我遇到了这个:
if (olderTime.happenedWhen.Ticks > happenedWhen.Ticks)
{
thisIsTrulyNew = false;
}
olderTime.happenedWhen
和happenedWhen
均为DateTime
型。
这是比较DateTime的更准确的方法吗?
我知道Ticks表示从0001年1月1日00:00开始的100纳秒间隔。但是为什么要做这种比较呢?我认为我们可以这样做:
if (olderTime.happenedWhen > happenedWhen){
thisIsTrulyNew = false
}
刻度比较是否实现了正常比较无法实现的功能?
这是比较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;
}
}