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;
}
}