我是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
}
滴答比较是否达到了正常比较不会的效果?
答案 0 :(得分:33)
这是比较DateTime更准确的方法吗?
没有丝毫。实际上,这就是>
运算符在内部实现的方式。
public static bool operator >(DateTime t1, DateTime t2) {
return t1.InternalTicks > t2.InternalTicks;
}
有人可能认为他们通过跳过一行内部代码并直接进入Ticks
属性而变得聪明。实际上,Ticks
的getter返回InternalTicks
,因此除非编译器对其进行优化,否则使用Ticks
属性会添加两个调用以保存一个呼叫(两者都不会显着改变性能)。
答案 1 :(得分:18)
operator >
DateTime
的实现也比较了滴答,正如您从此反汇编代码中看到的那样(mscorlib.dll,System.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;
}
答案 2 :(得分:3)
>
运算符的实现如下:
public static bool operator >(DateTime t1, DateTime t2)
{
return t1.InternalTicks > t2.InternalTicks;
}
所以它真的一样(Ticks
返回InternalTicks
)。
答案 3 :(得分:3)
source显示了这一点:
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;
答案 4 :(得分:2)
这是一回事。
从source code >
运算符定义为:
public static bool operator >(DateTime t1, DateTime t2)
{
return t1.InternalTicks > t2.InternalTicks;
}
为了完整起见,Ticks
属性定义为:
public long Ticks
{
get
{
return InternalTicks;
}
}