1. 程式人生 > >.NET DateTime 源碼學習

.NET DateTime 源碼學習

源碼 相減 技術分享 sta ear 如果 天數 tof end

今天下載了微軟.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 源碼學習