2013-07-24 50 views
1

我需要获取两个给定日期之间的天数。我使用了“(endDate-startDate).Days”但我的高级建议它可能会导致一些内存泄漏,他告诉我,如果在32位系统上使用它,可能会导致不同的值,而在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. 

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

+8

你的高级不知道他在说关于。 –

+0

这是完全一样的东西。 – studert

+1

你的计算方法更好,因为你不会创建不必要的变量来保持时间跨度。 –

回答

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可以产生任何干扰)

+0

+1尼斯和简短的解释。 – Praveen

+2

非常棒的回答:)我喜欢这样的“老年人”,我有几个,这是一个虽然的情况下,但像这样的答案保持他们的嘴巴:) –

+0

**非常感谢Damien_The_Unbeliever先生**这么好的解释,我很满意:) –