0

所以我需要使用以下信息创建一个课程,我已经创建或至少制作了一个包含以下信息的课程,但是我在设置入学编号和年份标记的数字范围时遇到了麻烦,并且想知道是否任何人都可以帮助我

在 C# 中实现一个 Student 类型的类,该类应包含在文件 Student.cs 中。该类应符合以下规范:

属性示例数据验证

名字 “Basil” 非空白

SecondName “Fawlty” 非空白

出生日期 23/08/1946 非空白

课程“MA酒店管理”非空白

入学编号 12345 在 10000 到 99999 范围内

年标记 55 在范围 0 -100

继承人到目前为止我的课程,希望到目前为止它是正确的

namespace Student
{
    public class Student
    {
        private string firstname;
        private string secondname;
        private double dateofbirth;
        private string course;
        private int    matricnumber;
        private int    yearmark;

        public Student() 
        {
            firstname = "Basil";
            secondname = "Fawlty";
            dateofbirth = 23/08/1946;
            course = "MA Hotel Management";
            matricnumber = 12345;
            yearmark = 55;
        }
        public string FirstName
        {
            get { return firstname; }
            set { firstname = value; }
        }

        public string SecondName
        {
            get { return secondname; }
            set { secondname = value; }
        }
        public double DateOfBirth 
        {
            get { return dateofbirth; }
            set { dateofbirth = value; }
        }

        public string Course
        {
            get { return course; }
            set { course = value; }
        }
        public int Matricnumber
        {
            get { return matricnumber; }
            set { matricnumber = value; }
        }
        public int YearMark
        {
            get { return yearmark; }
            set {yearmark = value; }

        }
    }
}
4

4 回答 4

2

您可以在您的设置器中实现一些逻辑来检查该值是否有效。所以假设我需要一个属性,调用LastName某个只能是“Johnson”、“Smith”或“Roberts”的类。我可以做这样的事情:

private string _lastName;
public string LastName
{
    get { return _lastName; }
    set
    {
        if (value == "Johnson" || value == "Smith" || value == "Roberts")
        {
            _lastName = value;
        }
        else
        {
            // Do something here. Maybe set a default.  Maybe throw an exception. Whatever.
        }
    }
}

免责声明:我没有写一个确切的解决方案,因为这听起来真的像是家庭作业。

于 2012-10-19T21:01:23.827 回答
2

您需要将数据验证放在“set”方法中。如果用户输入了无效值,则抛出异常。

    public int Matricnumber
    {
        get { return matricnumber; }
        set { 
               if (value > 99999 | value < 10000)
                    throw new ArgumentException("Invalid value - MaticNumber must be in the range 10000-99999");
               matricnumber = value;
            }
    }

对于不能为空的值,您可能需要提供某种类型的 Validate() 方法来在事后使用 String.IsNullOrEmpty 来验证这一点,因为用默认值初始化类是没有意义的。

这有意义吗?

于 2012-10-19T21:03:05.837 回答
1

如果您想对/按班级进行验证,您可以执行以下操作:

    public int Matricnumber
    {
        get { return matricnumber; }
        set 
        {
           if (value < MinMatric || value > MaxMatric)
             throw new ArgumentOutOfRangeException("Matricnumber"); 
           matricnumber = value; 
        }
    }
于 2012-10-19T21:01:27.760 回答
0

您的问题没有指定要防止设置错误值的行为。

一般来说,我会喜欢您指定的限制要求的代码合同。这是使用合同解决问题的一种方法。

[ContractInvariantMethod]
private void ObjectInvariant()
{
    Contract.Invariant( matricnumber <= 99999 );
    Contract.Invariant( matricnumber >= 10000 );
    Contract.Invariant( yearmark <= 100 );
    Contract.Invariant( yearmark >= 0 );
}

这需要您在此处安装 Microsoft的代码合同,并启用运行时检查。提供ContractInvariantMethod了在进入和退出方法时必须为真的不变量。如果不变量不成立,则会抛出异常。但是,您可以配置不同的故障行为。

该类Contract还有其他成员,您可以在应用了限制的属性中使用这些成员。

更传统的解决方案是使用条件语句来检查设置的要求并手动处理错误(抛出异常、不采取任何措施、设置为最接近的界限等)。

于 2012-10-19T21:03:53.970 回答