分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

.NET DateTime 源码学习

发布时间:2023-09-06 01:16责任编辑:白小东关键词:.NET

今天下载了微软.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 源码学习

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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved