.NET DateTime 源碼學習
阿新 • • 發佈:2017-10-10
源碼 相減 技術分享 sta ear 如果 天數 tof end
今天下載了微軟.Net 源碼,看了一下DateTime類,做下記錄
DaysInMonth 這個方法是獲取某年某月的天數,平時直接用覺得很簡單,今天看到源碼,發現設計的還是很好的
我想如果是我的話,封裝這個方法應該會根據每個月固定天數,直接一個switch就完了;
但是看看微軟是怎麽做的
public static int DaysInMonth(int year, int month) { if (month < 1 || month > 12) throw new ArgumentOutOfRangeException("View Codemonth", Environment.GetResourceString("ArgumentOutOfRange_Month")); Contract.EndContractBlock(); // IsLeapYear checks the year argument int[] days = IsLeapYear(year)? DaysToMonth366: DaysToMonth365; return days[month] - days[month - 1]; }
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, 121View Code, 152, 182, 213, 244, 274, 305, 335, 366};
可以看到,DaysToMonth366是閏年從第一個月到當前月的天數之和, DaysToMonth365是平年從第一個月到當前月的天數之和
為什麽要這樣設計呢?我開始也不明白,後來想明白了
如果僅僅是針對DaysInMonth這個方法 這樣設計是大材小用,完全可以把每個月的天數單獨放進數組裏,而不用存天數之和這種方式,之所以這樣做,是因為還有很多其他方法會頻繁的用到天數之和之類的操作,比如從3月到5月多少天,就很方便取得結果,而單獨一個月的天數也可用使用相減的操作來方便獲得;
不過對於強迫癥來說,DaysToMonth366和DaysToMonth365 這兩個數組中只有2月的天數不一樣,其他其實都一樣,真的很想再抽象一層啊。。。。
.NET DateTime 源碼學習