我有一个字节属性的问题。如果减去一个会使数字低于0的金额,我希望该属性为0。
我的问题是,在一个属性中,我只得到value字段,其中计算已经完成,并且值不是负数,而是从最大字节值中减去的负数。
不能将属性类型更改为sbyte。
有没有办法确保4减5是0而不是255,而不是编写显式的setter方法并且只使用getter属性?
发布于 2012-01-13 10:54:53
首先,避免将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设置值,我更愿意怀疑他们在这方面做得很好。
发布于 2012-01-13 09:51:44
下面这样如何,其中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;
}
}更新
多亏了32位孩子,我现在意识到上面的解决方案将不起作用,因为任何负值都会在到达setter之前转换为正值。
除了在赋值之前检查值之外,解决此问题的唯一方法是将属性的数据类型更改为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;
}
}https://stackoverflow.com/questions/8844828
复制相似问题