C#在一个类中设置一系列数字

时间:2012-10-19 20:55:28

标签: c# visual-studio-2010

所以我需要创建一个包含以下信息的课程,我已创建或至少创建了一个以下信息最多的课程,但我怎么设置预科编号和年份分数和我想知道是否有人可以帮助我

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

属性示例数据验证

FirstName“Basil”不是空白

SecondName“Fawlty”不是空白

出生日期19/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 个答案:

答案 0 :(得分:2)

您可以在setter中实现一些逻辑,以检查该值是否有效。所以假装我需要一个名为LastName的属性,这个属性只能是“约翰逊”,“史密斯”或“罗伯茨”。我可以这样做:

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

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

答案 1 :(得分: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进行验证,因为使用默认值初始化类是没有意义的。

这有意义吗?

答案 2 :(得分:1)

如果您想在课程上/通过课程进行验证,您可以执行以下操作:

    public int Matricnumber
    {
        get { return matricnumber; }
        set 
        {
           if (value < MinMatric || value > MaxMatric)
             throw new ArgumentOutOfRangeException("Matricnumber"); 
           matricnumber = value; 
        }
    }

答案 3 :(得分:0)

您的问题未指定您希望阻止设置错误值的行为。

一般情况下,对于您指定的限制要求,我会成为code contracts的粉丝。以下是使用合同解决问题的一种方法。

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

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

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

更传统的解决方案是使用条件语句来检查设置和处理错误的要求(抛出异常,不采取任何操作,设置为最接近的边界等)。