C#中的Date提姆e是值类型照旧引用类型

日前遭逢了Date提姆e到底是值类型照旧引用类型的迷惑,顺势较深切地驾驭一下Date提姆e相关的内容

结论:Date提姆e是值类型,因为Date提姆e是结构体,而结构体继承自System.ValueType,属于值类型

 

一、Date提姆e是值类型依旧引用类型的探赜索隐

二、了解DateTime结构体

三、Date提姆e.Now和Date提姆e.UtcNow是怎么计算出来的

 

一、Date提姆e是值类型照旧引用类型的探赜索隐

  1. 先编制测试代码

 图片 1

将date提姆e1赋值给date提姆e2,然后改变date提姆e1的值,如若date提姆e2的的值也随之变动,那么Date提姆e便是援引类型,看看结果吗:

 图片 2

date提姆e1伸张了3天后,date提姆e2依旧是2017/4/11,这一度能初阶注脚难题了。

 

2.
为了进一步规定结论,最可信的法子是查看变量的地点,值类型的话,date提姆e1和date提姆e2的地方应该例外。

 图片 3

由此看来确实是不一致的,Date提姆e是值类型无疑了。

二、了解DateTime结构体

转到DateTime的概念,也可以看看Date提姆e确实是struct类型,

 图片 4

总的看前边的考试都是无用功了,但Date提姆e到底是哪些的布局体呢,主要有如下成员

 图片 5

这一个分子内部最关键的是Ticks

Ticks的年月值以 100
毫阿秒为单位,它的64位中,前两位表示Kind,前面62位表示有稍许个毫微秒。Kind用来指示Date提姆e 结构是意味着当地时间、协调通用时间 (UTC) 依旧 UTC
和本土时间都未指定。Kind 字段用于拍卖地点时间和 UTC
时间之内的更换。

Date提姆e的值范围在0001/1/1
00:00:00到9999/12/31 23:59:59里面

 

三、Date提姆e.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);
    }
}

 

太复杂了啊看不懂,但可以看看大概的情趣是先拿走Date提姆e.UtcNow,然后转换为地面时间

再反编译Date提姆e.UtcNow

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

 

 

最后查阅GetSystem提姆eAsFile提姆e()是Windows的API,成效便是得到当前的UTC时间

                                                       

相关文章