C#中的DateTime是值類型仍是引用類型

近期遇到了DateTime究竟是值類型仍是引用類型的疑惑,順勢較深刻地瞭解一下DateTime相關的內容測試

結論:DateTime是值類型,由於DateTime是結構體,而結構體繼承自System.ValueType,屬於值類型spa

 

1、DateTime是值類型仍是引用類型的探索code

2、瞭解DateTime結構體繼承

3、DateTime.Now和DateTime.UtcNow是怎麼計算出來的get

 

1、DateTime是值類型仍是引用類型的探索it

1. 先編寫測試代碼編譯

 

將dateTime1賦值給dateTime2,而後改變dateTime1的值,若是dateTime2的的值也跟着改變,那麼DateTime即是引用類型,看看結果吧:class

 

dateTime1增長了3天后,dateTime2仍然是2017/4/11,這已經能初步說明問題了。變量

 

2. 爲了進一步肯定結論,最可靠的方法是查看變量的地址,值類型的話,dateTime1和dateTime2的地址應該不一樣。date

 

看來確實是不一樣的,DateTime是值類型無疑了。

2、瞭解DateTime結構體

轉到DateTime的定義,也能夠看到DateTime確實是struct類型,

 

看來前面的試驗都是無用功了,但DateTime究竟是怎樣的結構體呢,主要有以下成員

 

這些成員裏面最關鍵的是Ticks

Ticks的時間值以 100 毫微秒爲單位,它的64位中,前兩位表示Kind,後面62位表示有多少個毫微秒。Kind用來指示 DateTime 結構是表示本地時間、協調通用時間 (UTC) 仍是 UTC 和本地時間都未指定。Kind 字段用於處理本地時間和 UTC 時間之間的轉換。

DateTime的值範圍在0001/1/1 00:00:00到9999/12/31 23:59:59之間

 

3、DateTime.Now和DateTime.UtcNow是怎麼計算出來的

反編譯DateTime.Now以下

public static DateTime Now
{
    [__DynamicallyInvokable]
    get
    {
        DateTime utcNow = DateTime.UtcNow;
        bool isAmbiguousDst = false;
        long ticks = TimeZoneInfo.GetDateTimeNowUtcOffsetFromUtc(utcNow, out isAmbiguousDst).Ticks;
        long num = utcNow.Ticks + ticks;
        if (num > 3155378975999999999L)
        {
            return new DateTime(3155378975999999999L, DateTimeKind.Local);
        }
        if (num < 0L)
        {
            return new DateTime(0L, DateTimeKind.Local);
        }
        return new DateTime(num, DateTimeKind.Local, isAmbiguousDst);
    }
}

 

太複雜了啊看不懂,但能夠看到大體的意思是先獲取DateTime.UtcNow,而後轉換爲本地時間

再反編譯DateTime.UtcNow

public static DateTime UtcNow
{
    [__DynamicallyInvokable, SecuritySafeCritical]
    get
    {
        long systemTimeAsFileTime = DateTime.GetSystemTimeAsFileTime();
        return new DateTime((ulong)(systemTimeAsFileTime + 504911232000000000L | 4611686018427387904L));
    }
}

 

 

最後查閱GetSystemTimeAsFileTime()是Windows的API,做用即是獲取當前的UTC時間

相關文章
相關標籤/搜索