2012-10-19 59 views
0

所以我需要創建一個類與以下信息,我已經創建或至少使下面的信息最多的一個,我怎麼有麻煩設置的範圍數字作爲錄取號碼和年份標記,並想知道是否有人可以幫助我C#設置一個類的範圍內的數字

在C#中實現一類Student類,類應包含在一個文件中 Student.cs。該類應符合以下規範:

屬性示例數據驗證

姓「瓦西里」不爲空

SecondName「寶泉」不爲空

出生日期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; } 

     } 
    } 
} 
+7

幫助你瞭解到底是什麼?你忘了提到你的問題。 – Oded

+2

你打算驗證輸入的數字嗎?只需在'Matricnumber'二傳手中進行檢查。如果超出範圍,則拋出異常或將其限制在範圍內的有效值。 –

+3

[tag:Homework]標籤已經過時了,這太糟糕了...這個標籤已經成熟了。 – smdrager

回答

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

免責聲明:我沒有寫的精確解決方案,因爲它真的聽起來這是功課。

+0

你好我以爲我會是這樣的事情,但這將意味着即時通訊將不得不輸入每個數字manualy從0 - 100或10000 - 99999, iis那裏沒有一個離開,所以不必這樣, – user1760510

+0

@Gromer即使這是作業,你可以回答matricnumber,他/她將能夠弄清楚如何解決年鑑問題。 –

+0

由於您正在談論數字,您可以使用'<', '>','<=' and '> ='。如果像'if(value == 1 || value == 2 ... || value == 9999)'那麼不需要做很長時間。 – Gromer

1

如果你想在/驗證由類,你可以這樣做:

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

+1'ArgumentOutOfRangeException'在這裏似乎更合適 –

+1

是的,編輯過____ –

2

你需要把數據驗證在「設置」方法。如果用戶輸入無效值,則拋出異常。

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

在不能爲空值,你大概會需要提供某種類型的驗證()方法在事後驗證這個使用String.IsNullOrEmpty,因爲在初始化與默認類沒有意義值。

這是否有意義?

+0

你應該拋出一個ArgumentOutOfRangeException來清除發生的錯誤 –

+0

如果部分我不能把其他部分,然後有一個錯誤我在一個messgae盒子裏顯示一些東西? – user1760510

+0

@ user1760510 @ rmayer06:「if」條件不正確地只使用1個管道。它應該是:'如果(值> 99999 ||值<10000)'與兩個管道。 –

0

您的問題沒有指定您希望防止設置錯誤值的行爲。

一般來說,對於您指定的限制條件,我會是code contracts的粉絲。這是使用合同解決問題的一種方法。

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

這需要你從微軟here安裝代碼契約,並啓用運行時檢查。 ContractInvariantMethod提供了在輸入和退出方法時必須爲真的不變式。如果不變量不成立,則拋出異常。但是,您可以配置不同的故障行爲。

Contract類也有其他成員,您可以在該屬性中應用限制。

更傳統的解決方案是使用條件語句來手動檢查集合上的需求和處理錯誤(拋出異常,不採取任何操作,設置爲最接近的邊界等)。