我遇到了一个字节属性的问题。 我想要的属性为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