码迷,mamicode.com
首页 > Web开发 > 详细

.NET DateTime 源码学习

时间:2017-10-10 20:34:07      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:个数   天下   resource   不用   stat   抽象   date   public   闰年   

今天下载了微软.Net 源码,看了一下DateTime类,做下记录

DaysInMonth 这个方法是获取某年某月的天数,平时直接用觉得很简单,今天看到源码,发现设计的还是很好的

我想如果是我的话,封装这个方法应该会根据每个月固定天数,直接一个switch就完了;

但是看看微软是怎么做的

技术分享
        public static int DaysInMonth(int year, int month) {
            if (month < 1 || month > 12)
                throw new ArgumentOutOfRangeException("month", Environment.GetResourceString("ArgumentOutOfRange_Month"));
            Contract.EndContractBlock();
            // IsLeapYear checks the year argument
            int[] days = IsLeapYear(year)? DaysToMonth366: DaysToMonth365;
            return days[month] - days[month - 1];
        }
View Code

1:参数错误,抛出异常;

2:判断是否是闰年,闰年的话用闰年的方式计算,反之用平年;

3:有趣的是DaysToMonth366和DaysToMonth365,这两个变量是什么呢?

技术分享
        private static readonly int[] DaysToMonth365 = {
            0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
        private static readonly int[] DaysToMonth366 = {
            0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366};
View Code

可以看到,DaysToMonth366是闰年从第一个月到当前月的天数之和, DaysToMonth365是平年从第一个月到当前月的天数之和

为什么要这样设计呢?我开始也不明白,后来想明白了

如果仅仅是针对DaysInMonth这个方法 这样设计是大材小用,完全可以把每个月的天数单独放进数组里,而不用存天数之和这种方式,之所以这样做,是因为还有很多其他方法会频繁的用到天数之和之类的操作,比如从3月到5月多少天,就很方便取得结果,而单独一个月的天数也可用使用相减的操作来方便获得;

不过对于强迫症来说,DaysToMonth366和DaysToMonth365 这两个数组中只有2月的天数不一样,其他其实都一样,真的很想再抽象一层啊。。。。

 

.NET DateTime 源码学习

标签:个数   天下   resource   不用   stat   抽象   date   public   闰年   

原文地址:http://www.cnblogs.com/wolfworker/p/7647283.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!