.NET DateTime 源码学习

今天下载了微软.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月的天数不一样,其他其实都一样,真的很想再抽象一层啊。。。。

 

posted @ 2017-10-10 19:04  阿祖哥  阅读(348)  评论(1编辑  收藏  举报