我遇到了一个byte属性的问题。 如果减去一个将数字设置为低于0的金额,我希望该属性为0.
我的问题是,在一个属性中,我只得到计算已经完成的值字段,并且该值不是负数,而是从字节的最大值中减去的负数。
将属性类型更改为sbyte不是选项。
如果没有编写显式的setter方法且只使用getter属性,有没有办法确保4减5为0而不是255?
答案 0 :(得分:2)
首先,避免使用byte
进行一般积分使用。在int
上操作更快,为您提供更大的灵活性,字节只会在您打包时节省空间,即使这样,在您拥有数百万个此类对象之前,保存也不会很重要。
现在,您不清楚“减去的数字”在哪里。
如果不能为负的规则是状态的问题(而不是“它实际上是否定的,但显示为零,例如-3加2仍将显示零,因为内部为零”),然后强制执行这种规则发生在相互作用的地方。
private void Subtract(int subtrahend)
{
value = Math.Max(value - subtrahend, 0);
}
如果它应该在内部为负但显示为零,则只需在getter
中执行此操作public byte ByteForSomeReason
{
get { return Math.Max(value, 0); }
}
或者确实,在制定者中这样做。你对setter设置值有什么看法,我宁愿怀疑他们会擅长这个。
答案 1 :(得分:1)
这样的东西怎么样,其中backing属性是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,但随后提供提供所需功能的byte属性。
例如:
public int TestValue {get; set; }
public byte TestValueAsByte
{
get
{
if (this.TestValue < 0)
{
return 0;
}
else
{
return (byte)this.TestValue;
}
}
set
{
this.TestValue = value;
}
}