Я не вижу причин, по которым это могло бы оптимизировать ... я уверен, что этого не произойдет (я знаю , что не оптимизирует его на уровне IL, но это ничего не говорит о JIT ; но я действительно не думаю, что это произойдет - он не знает, что метод всегда будет возвращать одно и то же каждый раз ).
Вместо этого выньте его из цикла, если вам это нужно:
var oaDate = new DateTime(2011, 3, 13).ToOADate();
...loop...
if (md.DT_OA > oaDate) {...}
Re просто new DateTime(int,int,int)
(комментарии); давайте создадим тестовую программу:
static void Main()
{
for (int i = 0; i < 1000; i++)
{
if (DateTime.Now > new DateTime(2011, 3, 13)) Console.WriteLine("abc");
}
}
если мы скомпилируем это и затем разберем IL (рефлектор / ildasm / и т. Д.), Мы получим:
L_0000: ldc.i4.0
L_0001: stloc.0
L_0002: br.s L_002b
L_0004: call valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
L_0009: ldc.i4 0x7db
L_000e: ldc.i4.3
L_000f: ldc.i4.s 13
L_0011: newobj instance void [mscorlib]System.DateTime::.ctor(int32, int32, int32)
L_0016: call bool [mscorlib]System.DateTime::op_GreaterThan(valuetype [mscorlib]System.DateTime, valuetype [mscorlib]System.DateTime)
L_001b: brfalse.s L_0027
L_001d: ldstr "abc"
L_0022: call void [mscorlib]System.Console::WriteLine(string)
L_0027: ldloc.0
L_0028: ldc.i4.1
L_0029: add
L_002a: stloc.0
L_002b: ldloc.0
L_002c: ldc.i4 0x3e8
L_0031: blt.s L_0004
L_0033: ret
Посмотрите с L_0009 по L_0011 - это создает new DateTime
для каждой итерации цикла (L_0031: blt.s L_0004
- это повтор цикла). Как я и ожидал, компилятор был очень буквальным с вашим запросом.