C#将作为参数传递的值转换为变量

时间:2018-10-05 23:53:32

标签: c# if-statement methods constructor arguments

我无法理解传递给方法的变量和参数之间的关系。下面的程序应该从主方法(MDY)中获取三个整数,并使用各种方法来验证它是否为有效日期。这包括确保年份介于1900和2100之间,并确保月份为1-12,并且日期在该月的日期范围内(包括2月29日为leap年)。如果main方法中的日期无效,则程序应这样说并打印默认日期1/1/1900。不管提供什么参数,下面的代码始终显示默认值。我认为这是因为我使用变量MDY或变量MonthDay的方式存在问题, Year。该程序是一项作业,在其中我必须使用下面的代码中的所有方法和构造函数。我不确定如何将参数MDY变成变量MonthDayYear,因此它们可以通过为我提供的ShowDate方法进行打印。

class Date
{
    private int Month;
    private int Day;
    private int Year;

    // Sets date to 1/1/1900
    public Date()
    {
        Month = 1;
        Day = 1;
        Year = 1900;
    }

    public Date(int M, int D, int Y)
    {
        SetDate(M, D, Y);
    }

    public Boolean SetDate(int M, int D, int Y)
    {

        if (ValidateDate(M, D, Y))
        {
            Month = M;
            Day = D;
            Year = Y;
            return true;

        }
        else
        {
            Console.WriteLine("Invalide date");
            SetDefaultDate();
            return false;
        }

    }

    private void SetDefaultDate()
    {
        Month = 1;
        Day = 1;
        Year = 1900;
    }
    // Determines if date is valid.
    public Boolean ValidateDate(int M, int D, int Y)
    {
        ValidateMonth();
        ValidateDay();
        ValidateYear();

        if (ValidateMonth() && ValidateDay() && ValidateYear())
        {
            ShowDate();
            return true;
        }
        else
        {
            return false;
        }


    }
        // Determines if month is valid.
    public Boolean ValidateMonth()
    {
        if (Month >= 1 && Month <= 12)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
        // Determines if year is valid.
    public Boolean ValidateYear()
    {
        if(Year >= 1900 && Year <= 2100)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
        // Determines if day is valid
    public Boolean ValidateDay()
    {
        IsLeapYear();

        if(Month == 1 || Month == 3 || Month == 5 || Month == 7 || Month == 8 || Month == 10 || Month == 12)
        {
            if (Day >= 1 && Day <= 31)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else if (Month == 4 || Month == 6 || Month == 9 || Month == 11)
        {
            if (Day >= 1 && Day <= 30)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else if (Month == 2 && IsLeapYear())
        {
            if (Day >= 1 && Day <= 29)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else if (Month == 2 && !IsLeapYear())
        {
            if (Day >= 1 && Day <= 28)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }

    // Determine if year is a leap year
    public Boolean IsLeapYear()
    {
        if ((Year % 4 == 0 && Year % 100 != 0) || (Year % 400 == 0))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

        // Print date to screen in format M/D/Y
    public void DisplayDate()
    {
        Console.WriteLine(ShowDate());
    }

    public String ShowDate()
    {
        StringBuilder myStringBuilder = new StringBuilder();
        myStringBuilder.AppendFormat("{0} / {1} / {2}", Month, Day, Year);
        Console.WriteLine("{0}", myStringBuilder);
        return (myStringBuilder.ToString());

    }

    static void Main(string[] args)
    {

        Date NewDate = new Date();
        NewDate.SetDate(11,11,2011);

        Console.ReadLine();
    }

}

2 个答案:

答案 0 :(得分:1)

您永远不会将MDY分配给MonthDayYear字段,因此您要检查自己的默认值,默认情况下均为零。您可以 MDY分配给它们相应的预期变量,但是那样您就不必验证输入,而只是验证您的字段。相反,您可以让您的方法接受参数并检查传递给它的内容:

public Boolean ValidateMonth(int month)
{
    if (month >= 1 && month <= 12)
    {
        return true;
    }
    else
    {
        return false;
    }
}

然后调用它

 ValidateMonth(M);

然后您可以对其他两种方法执行相同的操作。

在您的ValidateDate()方法中,您还对ValidateMonth()ValidateDay()ValidateYear()进行了三个无用的调用。您分别两次调用这些方法。 (从头开始,然后在if语句中再次出现。)您可以删除以下内容:

 public Boolean ValidateDate(int M, int D, int Y)
{
    //Remove these:
    //ValidateMonth();
    //ValidateDay();
    //ValidateYear();

    if (ValidateMonth() && ValidateDay() && ValidateYear())
    {
        ShowDate();
        return true;
    }
    else
    {
        return false;
    }


}

答案 1 :(得分:0)

您的构造函数应使用给定的值初始化类。当前,您的默认构造函数会初始化MDY,但是带有参数的构造函数不会初始化。

您可以通过更改构造函数使其更像这样来解决此问题:

public Date() : this(1,1,1900)
{
}

public Date(int M, int D, int Y)
{
    Month = M;
    Day = D;
    Year = Y;
}

一旦类被初始化,仅是公开一个属性或方法以验证该类中已保存的值的问题。由于已经设置了月,日和年,因此您无需再次将它们传递给方法。因此validate方法可能看起来像这样:

public bool IsValid
{
    get
    {
        return ValidateDay() && ValidateMonth() && ValidateYear();
    }
}

在主程序中:

Date newDate = new Date(11,11,2011);
if (newDate.IsValid)
{
    Console.WriteLine("Date is valid.");
}
else
{
    Console.WriteLine("Date is not valid.");
}