一个byte属性,如果该值为负,则应为0?

时间:2012-01-13 01:32:51

标签: c# properties byte

我遇到了一个byte属性的问题。 如果减去一个将数字设置为低于0的金额,我希望该属性为0.

我的问题是,在一个属性中,我只得到计算已经完成的值字段,并且该值不是负数,而是从字节的最大值中减去的负数。

将属性类型更改为sbyte不是选项。

如果没有编写显式的setter方法且只使用getter属性,有没有办法确保4减5为0而不是255?

2 个答案:

答案 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;
        }
    }