DaysInMonth这个方法是获取某年某月的天数,平时直接用觉得很简单,今天看到源码,发现设计的还是很好的
我想如果是我的话,封装这个方法应该会根据每个月固定天数,直接一个switch就完了;
但是看看微软是怎么做的
publicstaticintDaysInMonth(intyear,intmonth){ if(month<1||month>12) thrownewArgumentOutOfRangeException("month",Environment.GetResourceString("ArgumentOutOfRange_Month")); Contract.EndContractBlock(); //IsLeapYearcheckstheyearargument int[]days=IsLeapYear(year)?DaysToMonth366:DaysToMonth365; returndays[month]-days[month-1]; } |
1:参数错误,抛出异常;
2:判断是否是闰年,闰年的话用闰年的方式计算,反之用平年;
3:有趣的是DaysToMonth366和DaysToMonth365,这两个变量是什么呢?
privatestaticreadonlyint[]DaysToMonth365={ 0,31,59,90,120,151,181,212,243,273,304,334,365}; privatestaticreadonlyint[]DaysToMonth366={ 0,31,60,91,121,152,182,213,244,274,305,335,366}; |
可以看到,DaysToMonth366是闰年从第一个月到当前月的天数之和,DaysToMonth365是平年从第一个月到当前月的天数之和
为什么要这样设计呢?我开始也不明白,后来想明白了
如果仅仅是针对DaysInMonth这个方法这样设计是大材小用,完全可以把每个月的天数单独放进数组里,而不用存天数之和这种方式,之所以这样做,是因为还有很多其他方法会频繁的用到天数之和之类的操作,比如从3月到5月多少天,就很方便取得结果,而单独一个月的天数也可用使用相减的操作来方便获得;
不过对于强迫症来说,DaysToMonth366和DaysToMonth365这两个数组中只有2月的天数不一样,其他其实都一样,真的很想再抽象一层啊。。。。