2012-01-13 49 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); } 
} 

或者的确,在二传手这样做。你有什么反对二传手设置价值观,我宁愿怀疑他们会擅长这一点。