2013-07-24 47 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先生**這麼好的解釋,我很滿意:) –