我在C#中创建自己的DateTime类,由于某种原因我的检查不起作用。当我运行程序并输入一个日期时,它总是停止并到达最后一行,即#34; Day"方法并说" ArgumentOutOfException。无论如何都要解决这个问题并让我的支票叫做"价值"工作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace date
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("\t\t\t\t\t\tNextDate Application\n\t\t\t\t\t-------------------------------------");
Console.WriteLine("please enter date as dd/MM/yyyy");
int day;
int month;
int year;
string[] read = Console.ReadLine().Split('/');
day = int.Parse(read[0]);
month = int.Parse(read[1]);
year = int.Parse(read[2]);
Date date = new Date(day, month, year);
Console.WriteLine("{0}/{1}/{2}", date.Day, date.Month, date.Year);
Console.ReadLine();
}
class Date
{
private int _month; // 1-12
private int _day; // 1-31 depending on month
private int _year;
public Date(int day, int month, int year)
{
Day = day;
Month = month;
Year = year;
}
public int Year
{
get { return _year; }
set
{
if (value >= 1820 && value <= 2020)
_year = value;
else
throw new ArgumentOutOfRangeException("year", value, "year out of range");
}
}
public int Month
{
get { return _month; }
set
{
if (value > 0 && value <= 12)
_month = value;
else
throw new ArgumentOutOfRangeException("Month", value, "Month must be 1-12");
}
}
public int Day
{
get { return _day; }
set
{
int[] days = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (value > 0 && value <= days[_month])
_day = value;
else if (_month == 2 && value == 29 &&
_year % 400 == 0 || (_year % 4 == 0 && _year % 100 != 0))
_day = value;
else
throw new ArgumentOutOfRangeException("Day", value, "Day is out of range");
}
}
}
}
}
答案 0 :(得分:5)
您在构造函数中执行的第一件事是设置Day
属性:
public Date(int day, int month, int year)
{
Day = day;
Month = month;
Year = year;
}
该setter 做什么?很多,似乎。具体来说,首先检查一下:
if (value > 0 && value <= days[_month])
对于您的输入(在上面的评论中),value
为3
。 3 > 0
是真的,所以没关系。但3
不是<= 0
。此时days[_month]
为0
。所以这种情况是错误的。
你的下一个条件是:
else if (_month == 2 && value == 29 &&
这也是错误的,因为_month
目前是0
(而value
是3
)。
那么你的方法有什么作用呢?这样:
throw new ArgumentOutOfRangeException("Day", value, "Day is out of range");
这解释了您获得ArgumentOutOfRangeException
的原因。抛出异常时,抛出该异常。
似乎就像你想在构造函数中设置Day
last 一样:
public Date(int day, int month, int year)
{
Year = year;
Month = month;
Day = day;
}
虽然您的值之间存在如此多的隐藏依赖关系,但也应该在更高的逻辑级别上解决。
答案 1 :(得分:5)
在你的构造函数中:
public Date(int day, int month, int year) { Day = day; Month = month; Year = year; }
您首先分配了Day
属性。此时Month
将默认初始化 - 为零 - 但Day
setter中的检查假设Month
已设置。因此,月份值中的日期将为0。
您需要重新考虑如何执行此操作。可能更好的是不使用自动属性,因此您可以设置字段,然后验证整个日期。
将setter和验证保存到外部接口。
更好的做法是使其成为一种可模拟的值类型。
最好不要重新发明轮子(除非你有非常good reason)。
答案 2 :(得分:-2)
Date
构造函数。在白天分配前一个月。您需要更改Date构造函数,如下所示。
public Date(int day, int month, int year)
{
Month = month;
Day = day;
Year = year;
}