查询与获取两天之间的天数有关

时间:2013-07-24 06:35:52

标签: c#

我需要获得两个给定日期之间的天数。

我使用“(endDate-startDate).Days”但是我的高级建议它可能会导致一些内存泄漏,他告诉我如果在32位系统上使用它可能会导致不同的值vs 64位系统并建议我使用TimeSpan然后获取Days。

我无法理解这一点。

有人可以解释一下它可能会导致任何内存管理问题吗?

DateTime dt1 = dateTime.Now;
DateTime dt2 = dateTime.Now.Adddays(-10);
int daysDiff = (dt2-dt1).Days; // I'm doing like this.

TimeSpan ts = dt2-dt1; // this is what my senior-
int daysDiff = ts.Days. // advised me.

如果我错了,请纠正我,因为我不熟悉这一点。在此先感谢,我感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

C#代码:

    int YourVersion()
    {
        DateTime dt1 = DateTime.Now;
        DateTime dt2 = DateTime.Now.AddDays(-10);
        int daysDiff = (dt2 - dt1).Days;
        return daysDiff;
    }
    int SeniorVersion()
    {
        DateTime dt1 = DateTime.Now;
        DateTime dt2 = DateTime.Now.AddDays(-10);
        TimeSpan ts = dt2 - dt1;
        int daysDiff = ts.Days;
        return daysDiff;
    }

在VS2013上编译,发布版本,反编译IL:

此致:

.method private hidebysig instance int32 
        YourVersion() cil managed
{
  // Code size       48 (0x30)
  .maxstack  2
  .locals init ([0] valuetype [mscorlib]System.DateTime dt1,
           [1] valuetype [mscorlib]System.DateTime dt2,
           [2] int32 daysDiff,
           [3] valuetype [mscorlib]System.DateTime CS$0$0000,
           [4] valuetype [mscorlib]System.TimeSpan CS$0$0001)
  IL_0000:  call       valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
  IL_0005:  stloc.0
  IL_0006:  call       valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
  IL_000b:  stloc.3
  IL_000c:  ldloca.s   CS$0$0000
  IL_000e:  ldc.r8     -10.
  IL_0017:  call       instance valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::AddDays(float64)
  IL_001c:  stloc.1
  IL_001d:  ldloc.1
  IL_001e:  ldloc.0
  IL_001f:  call       valuetype [mscorlib]System.TimeSpan [mscorlib]System.DateTime::op_Subtraction(valuetype [mscorlib]System.DateTime,
                                                                                                     valuetype [mscorlib]System.DateTime)
  IL_0024:  stloc.s    CS$0$0001
  IL_0026:  ldloca.s   CS$0$0001
  IL_0028:  call       instance int32 [mscorlib]System.TimeSpan::get_Days()
  IL_002d:  stloc.2
  IL_002e:  ldloc.2
  IL_002f:  ret
} // end of method Program::YourVersion

你的大四学生:

.method private hidebysig instance int32 
        SeniorVersion() cil managed
{
  // Code size       48 (0x30)
  .maxstack  2
  .locals init ([0] valuetype [mscorlib]System.DateTime dt1,
           [1] valuetype [mscorlib]System.DateTime dt2,
           [2] valuetype [mscorlib]System.TimeSpan ts,
           [3] int32 daysDiff,
           [4] valuetype [mscorlib]System.DateTime CS$0$0000)
  IL_0000:  call       valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
  IL_0005:  stloc.0
  IL_0006:  call       valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
  IL_000b:  stloc.s    CS$0$0000
  IL_000d:  ldloca.s   CS$0$0000
  IL_000f:  ldc.r8     -10.
  IL_0018:  call       instance valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::AddDays(float64)
  IL_001d:  stloc.1
  IL_001e:  ldloc.1
  IL_001f:  ldloc.0
  IL_0020:  call       valuetype [mscorlib]System.TimeSpan [mscorlib]System.DateTime::op_Subtraction(valuetype [mscorlib]System.DateTime,
                                                                                                     valuetype [mscorlib]System.DateTime)
  IL_0025:  stloc.2
  IL_0026:  ldloca.s   ts
  IL_0028:  call       instance int32 [mscorlib]System.TimeSpan::get_Days()
  IL_002d:  stloc.3
  IL_002e:  ldloc.3
  IL_002f:  ret
} // end of method Program::SeniorVersion

区别?你的编译器生成TimeSpan变量用于保存dt2 - dt1的结果,而你的大四有一个命名变量。除此之外,它们是相同的代码。

没有内存泄漏的风险,代码在32位和64位系统上运行完全相同。

(根据用于访问局部变量的特定指令存在一些细微差别,但这些差异不会在JIT可以生成的代码中产生任何扰动)