近期遇到了DateTime到底是值類型還是引用類型的疑惑,順勢(shì)較深入地了解一下DateTime相關(guān)的內(nèi)容
結(jié)論:DateTime是值類型,因?yàn)镈ateTime是結(jié)構(gòu)體,而結(jié)構(gòu)體繼承自Syste.ValueType,屬于值類型
一、DateTime是值類型還是引用類型的探索
二、了解DateTime結(jié)構(gòu)體
三、DateTime.Now和DateTime.UtcNow是怎么計(jì)算出來(lái)的
一、DateTime是值類型還是引用類型的探索
1. 先編寫測(cè)試代碼
將dateTime1賦值給dateTime2,然后改變dateTime1的值,如果dateTime2的的值也跟著改變,那么DateTime便是引用類型,看看結(jié)果吧:
dateTime1增加了3天后,dateTime1仍然是2017/4/11,這已經(jīng)能初步說(shuō)明問(wèn)題了。
2. 為了進(jìn)一步確定結(jié)論,最可靠的方法是查看變量的地址,值類型的話,dateTime1和dateTime2的地址應(yīng)該不同。
看來(lái)確實(shí)是不同的,DateTime是值類型無(wú)疑了。
二、了解DateTime結(jié)構(gòu)體
轉(zhuǎn)到DateTime的定義,也可以看到DateTime確實(shí)是struct類型,
看來(lái)前面的試驗(yàn)都是無(wú)用功了,但DateTime到底是怎樣的結(jié)構(gòu)體呢,主要有如下成員
這些成員里面最關(guān)鍵的是Ticks
Ticks的時(shí)間值以
100 毫微秒為單位,它的64位中,前兩位表示Kind,后面62位表示有多少個(gè)毫微秒。Kind用來(lái)指示 DateTime
結(jié)構(gòu)是表示本地時(shí)間、協(xié)調(diào)通用時(shí)間 (UTC) 還是 UTC 和本地時(shí)間都未指定。Kind 字段用于處理本地時(shí)間和 UTC 時(shí)間之間的轉(zhuǎn)換。
DateTime的值范圍在0001/1/1 00:00:00到9999/12/31 23:59:59之間
三、DateTime.Now和DateTime.UtcNow是怎么計(jì)算出來(lái)的
反編譯DateTime.Now如下
太復(fù)雜了啊看不懂,但可以看到大致的意思是先獲取DateTime.UtcNow,然后轉(zhuǎn)換為本地時(shí)間
再反編譯DateTime.UtcNow
最后查閱GetSystemTimeAsFileTime()是Windows的API,作用便是獲取當(dāng)前的UTC時(shí)間