1.2.11 #
解答 #
在构造函数开始时做一次判断,非法时抛出异常。
首先建立一个数组,数组的第 1 项至第 12 项的值就是每个月的天数。
再声明一个布尔类型的变量,用于标记是否是闰年。
代码 #
internal class SmartDate
{
    public int Month { get; }   // 月
    public int Day { get; }     // 日
    public int Year { get; }    // 年
    // 每个月对应的天数,第 0 位空出来
    private static readonly int[] DayOfMonth = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    public SmartDate(int m, int d, int y)
    {
        if (Vaildation(m, d, y) == false)
            throw new FormatException("Invaild Date");
        Month = m;
        Day = d;
        Year = y;
    }
    private bool Vaildation(int m, int d, int y)
    {
        if (y < 0)
            return false;
        var isLeapYear = IsLeapYear(y);
        if (m > 12 || m < 1)
            return false;
        if (d < 0)
            return false;
        if (m == 2 && d > 29 && isLeapYear)
            return false;
        if (d > DayOfMonth[m])
            return false;
        return true;
    }
    private bool IsLeapYear(int y)
    {
        if (y % 400 == 0)
            return true;
        if (y % 100 != 0 && y % 4 == 0)
            return true;
        return false;
    }
    public override string ToString()
    {
        return Month + "/" + Day + "/" + Year;
    }
}