C#中的DateTime是值類型還是引用類型
近期遇到了DateTime到底是值類型還是引用類型的疑惑,順勢較深入地了解一下DateTime相關(guān)的內(nèi)容
結(jié)論:DateTime是值類型,因?yàn)镈ateTime是結(jié)構(gòu)體,而結(jié)構(gòu)體繼承自System.ValueType,屬于值類型
一、DateTime是值類型還是引用類型的探索
二、了解DateTime結(jié)構(gòu)體
三、DateTime.Now和DateTime.UtcNow是怎么計(jì)算出來的
一、DateTime是值類型還是引用類型的探索
1. 先編寫測試代碼
將dateTime1賦值給dateTime2,然后改變dateTime1的值,如果dateTime2的的值也跟著改變,那么DateTime便是引用類型,看看結(jié)果吧:
dateTime1增加了3天后,dateTime2仍然是2017/4/11,這已經(jīng)能初步說明問題了。
2. 為了進(jìn)一步確定結(jié)論,最可靠的方法是查看變量的地址,值類型的話,dateTime1和dateTime2的地址應(yīng)該不同。
看來確實(shí)是不同的,DateTime是值類型無疑了。
二、了解DateTime結(jié)構(gòu)體
轉(zhuǎn)到DateTime的定義,也可以看到DateTime確實(shí)是struct類型,
看來前面的試驗(yàn)都是無用功了,但DateTime到底是怎樣的結(jié)構(gòu)體呢,主要有如下成員
這些成員里面最關(guān)鍵的是Ticks
Ticks的時(shí)間值以 100 毫微秒為單位,它的64位中,前兩位表示Kind,后面62位表示有多少個(gè)毫微秒。Kind用來指示 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ì)算出來的
反編譯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); } }
太復(fù)雜了啊看不懂,但可以看到大致的意思是先獲取DateTime.UtcNow,然后轉(zhuǎn)換為本地時(shí)間
再反編譯DateTime.UtcNow
public static DateTime UtcNow { [__DynamicallyInvokable, SecuritySafeCritical] get { long systemTimeAsFileTime = DateTime.GetSystemTimeAsFileTime(); return new DateTime((ulong)(systemTimeAsFileTime + 504911232000000000L | 4611686018427387904L)); } }
最后查閱GetSystemTimeAsFileTime()是Windows的API,作用便是獲取當(dāng)前的UTC時(shí)間
以上所述是小編給大家介紹的C#中的DateTime是值類型還是引用類型,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)我們網(wǎng)站的支持!
上一篇:C#中String StringBuilder StringBuffer類的用法
欄 目:C#教程
下一篇:C# Socket實(shí)現(xiàn)簡單控制臺(tái)案例
本文標(biāo)題:C#中的DateTime是值類型還是引用類型
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5758.html
您可能感興趣的文章
- 01-10C#中查找Dictionary中的重復(fù)值的方法
- 01-10C#將圖片存放到SQL SERVER數(shù)據(jù)庫中的方法
- 01-10關(guān)于nancy中的身份驗(yàn)證
- 01-10C#身份證號(hào)碼驗(yàn)證是否正確
- 01-10C#中的事務(wù)用法實(shí)例分析
- 01-10C#實(shí)現(xiàn)讀取DataSet數(shù)據(jù)并顯示在ListView控件中的方法
- 01-10C#中深度復(fù)制和淺度復(fù)制詳解
- 01-10C#中的正則表達(dá)式介紹
- 01-10C#開發(fā)中的垃圾回收機(jī)制簡析
- 01-10C#語言中的修飾符匯總


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什