C#中的DateTime是值类型还是引用类型

 更新时间:2017年04月23日 10:19:17   作者:zhixin9001  
近期遇到了DateTime到底是值类型还是引用类型的疑惑,顺势较深入地了解一下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是值类型还是引用类型,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • C#中DateTimePicker默认值显示为空的问题

    C#中DateTimePicker默认值显示为空的问题

    这篇文章主要介绍了C#中DateTimePicker默认值显示为空的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • C#自定义处理xml数据类实例

    C#自定义处理xml数据类实例

    这篇文章主要介绍了C#自定义处理xml数据类,涉及C#针对XML的打开、读写等常用操作,并将其封装进一个类中以便于调用,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • C#如何使用PaddleOCR进行图片文字识别功能

    C#如何使用PaddleOCR进行图片文字识别功能

    PaddlePaddle(飞桨)是百度开发的深度学习平台,旨在为开发者提供全面、灵活的工具集,用于构建、训练和部署各种深度学习模型,它具有开放源代码、高度灵活性、可扩展性和分布式训练等特点,这篇文章主要介绍了C#使用PaddleOCR进行图片文字识别,需要的朋友可以参考下
    2024-04-04
  • C# 启用事务提交多条带参数的SQL语句实例代码

    C# 启用事务提交多条带参数的SQL语句实例代码

    这篇文章主要介绍了C# 启用事务提交多条带参数的SQL语句实例代码,需要的朋友可以参考下
    2018-02-02
  • C#静态变量与实例变量实例分析

    C#静态变量与实例变量实例分析

    这篇文章主要介绍了C#静态变量与实例变量,是深入掌握PHP程序设计所必须掌握的重要概念,需要的朋友可以参考下
    2014-09-09
  • c#实现摄像头拍照功能示例

    c#实现摄像头拍照功能示例

    这篇文章主要介绍了c#实现摄像头拍照功能示例,需要的朋友可以参考下
    2014-04-04
  • 利用C#实现获取当前设备硬件信息

    利用C#实现获取当前设备硬件信息

    这篇文章主要为大家详细介绍了如何利用C#实现获取当前设备硬件信息的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-03-03
  • 一篇文章说通C#中的异步迭代器

    一篇文章说通C#中的异步迭代器

    这篇文章主要给大家介绍了如何通过一篇文章说通C#中的异步迭代器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C#异步调用的好处和方法分享

    C#异步调用的好处和方法分享

    我们要明确,为什么要进行异步回调?众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传输等),都会导致方法阻塞,表现在界面上就是,程序卡或者死掉,界面元素不动了,不响应了
    2012-04-04
  • C# Winform实现截图工具的示例代码

    C# Winform实现截图工具的示例代码

    这篇文章主要为大家详细介绍了如何使用C# Winform制作一个简单的截图工具,从而实现截图功能,文中的示例代码讲解详细,有需要的可以参考下
    2024-02-02

最新评论