2012-01-13 50 views
0

我遇到了一個字節屬性的問題。 我想要的屬性爲0,如果金額被扣除,將設置數字低於0.如果值爲負值,應爲0的字節屬性?

我的問題是,在一個屬性中,我只能得到值字段,其中計算已完成,並且該值不是負數但從字節的最大值中減去負數。

將屬性類型更改爲sbyte不是選項。

有沒有什麼辦法可以確保4減5是0而不是255而不寫一個明確的setter方法並且只使用getter屬性?

+0

是否將屬性類型更改爲'int'選項?這就是.NET所做的一般。 – Ryan 2012-01-13 01:35:30

+0

你可能想看看'checked'關鍵字。 – 2012-01-13 01:36:03

+0

@minitech,'int'不能解決0問題。 @ 32bitkid,'checked'會產生一個異常問題。 – 2012-01-13 01:36:45

回答

1

如何這樣的事情,其中​​後備屬性是int:

private int m_TestValue; 
    public byte TestValue 
    { 
     get 
     { 
      if (m_TestValue < 0) 
      { 
       return 0; 
      } 
      else 
      { 
       return (byte)m_TestValue; 
      } 
     } 
     set { 
      m_TestValue = value; 
     } 
    } 

更新

感謝32bitkid,我現在認識到上述解決方案將無法工作,因爲任何負值會在到達設定者之前轉換爲正值。

除了在賦值之前檢查值之外,解決此問題的唯一方法是將該屬性的數據類型更改爲int,但隨後提供一個提供所需功能的字節屬性。

例如:

public int TestValue {get; set; } 

    public byte TestValueAsByte 
    { 
     get 
     { 
      if (this.TestValue < 0) 
      { 
       return 0; 
      } 
      else 
      { 
       return (byte)this.TestValue; 
      } 
     } 
     set 
     { 
      this.TestValue = value; 
     } 
    } 
+0

此解決方案沒有任何意義。 'foo.TestValue = 0; foo.TestValue - = 128; Assert.AreEqual(foo.TestValue,0);'斷言失敗,因爲它實際上等於'128'。因爲溢出發生在您的私有m_TestValue範圍之外,並且它僅被分配了溢出值+128。 – 2012-01-13 16:53:33

+0

@ 32bitkid:謝謝你指出。我很少使用字節,因此沒有意識到隱式溢出轉換的程度。我用建議的解決方案修改了答案。 – 2012-01-13 17:26:37

2

首先,避免byte一般積分使用。在int上運行速度更快,給您更多的靈活性,如果您將它們裝入,字節只會節省空間,即使這樣,只有擁有數百萬個這樣的對象,保存纔會顯着。

現在,你不清楚「減去的數字是」在哪裏。

如果不可否定的規則是一個狀態問題(而不是「它真的是負數,但顯示爲零,例如-3加2仍然顯示爲零,因爲它內部爲零」),那麼在分割發生的地點執行該規則。

private void Subtract(int subtrahend) 
{ 
    value = Math.Max(value - subtrahend, 0); 
} 

是否應該beinternally陰性,但顯示爲0,則只是做的是,在吸氣

public byte ByteForSomeReason 
{ 
    get { return Math.Max(value, 0); } 
} 

或者的確,在二傳手這樣做。你有什麼反對二傳手設置價值觀,我寧願懷疑他們會擅長這一點。