2016-11-14 95 views
1

我可以聲明一個int變量,其中從...到範圍,例如, int count只能有從019的值?用...聲明int變量...範圍

而當應該有一個超出範圍的其他值添加時,沒有任何事情發生,沒有例外,沒有新的值或別的東西只是忽略它。

我經常需要這個變量在一個類中,例如當我需要一個列表中的值,前進和後退按鈕以及某些方法。我不想每次都製作if條款或調用方法。

這裏是在我實際上是如何處理我的問題的代碼,但我不認爲這是做到這一點的好辦法:

private void btnZurueckData_Click(object sender, RoutedEventArgs e) 
{ 
    dataFromGuiToObject(index); 
    index--; 
    if (index > -1) 
    { 
     resetGUI(); 
     setDataToGui(zeichnungen, index); 
     btnVorData.IsEnabled = true; 
    } 
    else 
    { 
     btnZurueckData.IsEnabled = false; 
     index++; 
    } 
} 

private void btnVorData_Click(object sender, RoutedEventArgs e) 
{ 
    dataFromGuiToObject(index); 
    index++; 
    if (index < zeichnungen.Count) 
    { 
     resetGUI(); 
     setDataToGui(zeichnungen, index); 
     btnZurueckData.IsEnabled = true; 
    } 
    else 
    { 
     btnVorData.IsEnabled = false; 
     btnSpeichern.IsEnabled = true; 
     index--; 
    } 
} 
+6

將其設置爲邏輯屬性{}'? –

+0

或者(如果你的財產是一個DependencyProperty)使用'CoerceValueCallback',這樣你的Bindings繼續工作。 –

+0

評論下面的答案,雖然他們會工作,但我相信目的並不清楚,即有人正在閱讀'Count ++',其中'Count'是一個整數將期望*它增加..我認爲這是更好的如果值超出了@viveknuna建議的範圍,則拋出異常,或者用'TryIncrement'和'TryDecrement'實現自己的類'BoundInt'等。 – KMoussa

回答

3

亞歷克斯ķ已經建議你可以寫一個性能和用途像這樣的setter:

private int count; 

public int Count 
{ 
    get { return count; } 
    set 
    { 
     count = (value >= 0 && value <= 19) ? value : count; 
    } 
} 

這將檢查該變量的新值是否是您設置,如果沒有,就只停留在舊值的範圍之內。對於正常的int,初始值將爲0;

如果您使用Visual Studio類型:普通話並按TAB兩次。它會爲你自動生成一個刻板的屬性。

編輯:

要回答你,從評論的問題。你也可以調用屬性設置器中的方法。你可以只讓兩個方法來調節的按鈕具有開或關進行切換:

public partial class Form1 : Form 
{ 
    // this is just to make the code work 
    List<int> zeichnungen = Enumerable.Range(0, 19).ToList(); 

    private int count; 

    public int Count 
    { 
     get { return count; } 
     set 
     { 
      // if you are inside the bounds 
      if (value >= 0 && value <= 19) 
      { 
       count = value; 
       // enable the forward and backward button 
       switchButtons(); 
      } 
      else 
      { // you are out of bounds, so check at which side 
       // and enable accordingly 
       manageButtons(value); 
      } 
     } 
    } 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

Click事件,你可以增加或減少變量,離開邏輯setter和你2種自定義方法

private void btnVorData_Click(object sender, EventArgs e) 
    { 
     Count++; 
    } 

    private void btnZurueckData_Click(object sender, EventArgs e) 
    { 
     Count--; 
    } 

    // this method evaluates at which side you are 
    private void manageButtons(int value) 
    { 
     if (value > zeichnungen.Count) 
     { 
      btnVorData.Enabled = false; 
      btnSpeichern.Enabled = true; 
     } 
     else 
     { 
      btnZurueckData.Enabled = false; 
     } 
    } 

    // this just enables the forward and backward button and disables the save button 
    private void switchButtons() 
    { 
     btnVorData.Enabled = true; 
     btnZurueckData.Enabled = true; 
     btnSpeichern.Enabled = false; 
    } 

} 
+3

imo'count = Enumerable.Range(0,19).Contains(value )?價值:數;'更優雅 – Innat3

+2

@ Innat3它肯定看起來像它。但是,爲什麼呢,因爲它會檢查19次價值是否存在?每次將'count'變量設置爲新值時,它會創建一個長度爲19的額外的'IEnumarable '嗎? –

+0

該OP說:「當應該有一個超出範圍的其他值補充說什麼都沒有發生,[...],沒有新的價值或別的東西」。你爲什麼會認爲它應該是0?如果當然在開始的時候你會用-1來初始化它,而不是*它會*​​爲0,這正是我在我的帖子中所說的「初始值與通常的'int'一樣是0」 –

1

您可以在set屬性中進行此驗證。

private int count; 
public int Count 
{ 
    set 
    { 
     if (value < 0 || value > 19) throw new ArgumentOutOfRangeException(" Value should be between 0 to 19"); 
     this.count = value; 
    } 
    get { return this.count; } 
} 

如果值不在要求的範圍內或者以您的方式處理,則可以拋出異常。

您也可以將下列條件用於同一目的。

if((value) * (19 - value) < 0) 
     { 

     } 
+0

'當應該有其他值超出範圍補充說什麼都沒有發生,沒有例外[''我認爲你錯過了那部分。 –

+1

這就是爲什麼他提到OP可以處理它,但他想要的。 – Brandon

+0

是的,我已經在我的解釋中加入了這個,OP可以相應處理。我想,讓OP自己嘗試一些東西 –

-1

我2C ...

public int Index 
{ 
    get { return index; } 
    set { index = Math.Min(19, Math.Max(0, value)); } 
} 
+0

關注OPs問題中的「no new value」。如果該值大於19或小於0,他希望忽略它,並且不要將它放在19或0上。 –

+0

您是正確的。我'錯過了'沒有新價值'的部分。 – bixarrio

0

我會用一個函數 像

public bool Enable(int value, int max = 19, int min = 0) 
    { 
     if() 
     return (value >= min && value <= max); 
    } 

private void btnZurueckData_Click(object sender, RoutedEventArgs e) 
{ 
    dataFromGuiToObject(index); 
    index--; 
    if (Enable(index, zeichnungen.Count)) 
    { 
     resetGUI(); 
     setDataToGui(zeichnungen, index); 
     btnVorData.IsEnabled = true; 
    } 
    else 
    { 
     btnZurueckData.IsEnabled = false; 
     index++; 
    } 
} 

private void btnVorData_Click(object sender, RoutedEventArgs e) 
{ 
    dataFromGuiToObject(index); 
    index++; 
    if (Enable(index, zeichnungen.Count)) 
    { 
     resetGUI(); 
     setDataToGui(zeichnungen, index); 
     btnZurueckData.IsEnabled = true; 
    } 
    else 
    { 
     btnVorData.IsEnabled = false; 
     btnSpeichern.IsEnabled = true; 
     index--; 
    } 
} 

本功能將 1.撥打電話更清晰 2.不會躲屬性中的特定邏輯