我遇到了一個字節屬性的問題。 我想要的屬性爲0,如果金額被扣除,將設置數字低於0.如果值爲負值,應爲0的字節屬性?
我的問題是,在一個屬性中,我只能得到值字段,其中計算已完成,並且該值不是負數但從字節的最大值中減去負數。
將屬性類型更改爲sbyte不是選項。
有沒有什麼辦法可以確保4減5是0而不是255而不寫一個明確的setter方法並且只使用getter屬性?
我遇到了一個字節屬性的問題。 我想要的屬性爲0,如果金額被扣除,將設置數字低於0.如果值爲負值,應爲0的字節屬性?
我的問題是,在一個屬性中,我只能得到值字段,其中計算已完成,並且該值不是負數但從字節的最大值中減去負數。
將屬性類型更改爲sbyte不是選項。
有沒有什麼辦法可以確保4減5是0而不是255而不寫一個明確的setter方法並且只使用getter屬性?
如何這樣的事情,其中後備屬性是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;
}
}
此解決方案沒有任何意義。 'foo.TestValue = 0; foo.TestValue - = 128; Assert.AreEqual(foo.TestValue,0);'斷言失敗,因爲它實際上等於'128'。因爲溢出發生在您的私有m_TestValue範圍之外,並且它僅被分配了溢出值+128。 – 2012-01-13 16:53:33
@ 32bitkid:謝謝你指出。我很少使用字節,因此沒有意識到隱式溢出轉換的程度。我用建議的解決方案修改了答案。 – 2012-01-13 17:26:37
首先,避免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); }
}
或者的確,在二傳手這樣做。你有什麼反對二傳手設置價值觀,我寧願懷疑他們會擅長這一點。
是否將屬性類型更改爲'int'選項?這就是.NET所做的一般。 – Ryan 2012-01-13 01:35:30
你可能想看看'checked'關鍵字。 – 2012-01-13 01:36:03
@minitech,'int'不能解決0問題。 @ 32bitkid,'checked'會產生一個異常問題。 – 2012-01-13 01:36:45