程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中的DateTime是值類型還是引用類型

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

編輯:C#入門知識

C#中的DateTime是值類型還是引用類型。本站提示廣大學習愛好者:(C#中的DateTime是值類型還是引用類型)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中的DateTime是值類型還是引用類型正文


近期遇到了DateTime到底是值類型還是引用類型的疑惑,順勢較深入地了解一下DateTime相關的內容

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

一、DateTime是值類型還是引用類型的探索

二、了解DateTime結構體

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

一、DateTime是值類型還是引用類型的探索

1. 先編寫測試代碼

將dateTime1賦值給dateTime2,然後改變dateTime1的值,如果dateTime2的的值也跟著改變,那麼DateTime便是引用類型,看看結果吧:

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

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

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

二、了解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之間

三、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時間

以上所述是小編給大家介紹的C#中的DateTime是值類型還是引用類型,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對網站的支持!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved