Подтвердить что ты не робот

В С#, в чем разница между сопоставлением двух дат с использованием тика и так же, как и

Я новичок в С#. Я прошел через код, написанный кем-то, кто раньше работал над моим проектом, когда я наткнулся на это:

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

Оба olderTime.happenedWhen и happenedWhen имеют тип DateTime.

Является ли это более точным способом сравнения DateTime?

Я знаю, что Ticks представляет 100 наносекундных интервалов с 00:00, 1 января 0001 года. Но почему такое сравнение, когда я думал, что мы можем сделать:

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

Сопоставляет ли сравнение тиков что-то, что нормальное сравнение не будет?

4b9b3361

Ответ 1

Является ли это более точным способом сравнения DateTime?

Не в малейшей степени. Фактически, это то, как оператор > реализуется внутренне.

Из источника .NET Reference:

public static bool operator >(DateTime t1, DateTime t2) {
    return t1.InternalTicks > t2.InternalTicks;
}
Кто-то мог подумать, что они умны, пропуская одну строку внутреннего кода и перейдя прямо к свойству Ticks. В действительности, getter для Ticks возвращает InternalTicks, поэтому, если он не оптимизирован компилятором, использование свойства Ticks добавляет два вызова, чтобы сохранить один вызов (ни один из которых не изменит производительность значительно).

Ответ 2

Реализация 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;
}

Ответ 3

Оператор > реализуется следующим образом:

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

Итак, это действительно то же самое (как Ticks возвращает InternalTicks).

Ответ 4

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;

Ответ 5

Это одно и то же. Из исходного кода оператор > определяется как:

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

Только для полноты свойство Ticks определяется как:

public long Ticks
{
        get 
        { 
            return InternalTicks; 
        }
}