构造函数限制

Yoa*_*kov 5 c# class restriction

我想知道是否有办法限制建筑价值.这是我的代码:

class Student : Human 
{
    private double Grade;

    public Student(string FirstName, string LastName, double Grade)
        : base(FirstName, LastName)
    {
        this.FirstName = FirstName;
        this.LastName = LastName;
        this.Grade = Grade;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我创建一个新学生时,我希望将等级限制在> = 2.00和<= 6.00之间,如编译错误或运行时异常.有办法吗?(不要担心其他字段FirstName和LastName)

Dan*_*ker 12

您可以检查它并在运行时抛出异常,如下所示:

if (grade < 2.00 || grade > 6.00)
    throw new ArgumentOutOfRangeException("grade");
Run Code Online (Sandbox Code Playgroud)

始终将这些条件放在方法或构造函数的开头.我甚至把它们放在自己的#region(但这是我个人的偏好):

public Student(string firstName, string lastName, double grade)
    : base(firstName, lastName)
{
    #region Contract
    if (grade < 2.00 || grade > 6.00)
        throw new ArgumentOutOfRangeException("grade");
    #endregion
    this.FirstName = firstName;
    this.LastName = lastName;
    this.Grade = grade;
}
Run Code Online (Sandbox Code Playgroud)

但是,有一种方法可以使用代码约定来获取此类事件的编译时警告.您可以在MSDN上下载代码合同,在那里您也可以找到文档.它仅与Visual Studio的非Express版本集成,由Microsoft编写.它将检查方法调用是否可能符合您指定的合同.您的代码将变为:

using System.Diagnotistics.Contracts;

public Student(string firstName, string lastName, double grade)
    : base(firstName, lastName)
{
    #region Contract
    Contract.Requires<ArgumentOutOfRangeException>(grade >= 2.00);
    Contract.Requires<ArgumentOutOfRangeException>(grade <= 6.00);
    #endregion
    this.FirstName = firstName;
    this.LastName = lastName;
    this.Grade = grade;
}
Run Code Online (Sandbox Code Playgroud)