首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个byte属性,如果值为负数,那么它应该是0?

问一个byte属性,如果值为负数,那么它应该是0?
EN

Stack Overflow用户
提问于 2012-01-13 09:32:51
回答 2查看 355关注 0票数 0

我有一个字节属性的问题。如果减去一个会使数字低于0的金额,我希望该属性为0。

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

不能将属性类型更改为sbyte。

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

EN

回答 2

Stack Overflow用户

发布于 2012-01-13 10:54:53

首先,避免将byte用于一般的整型使用。在int上运行更快,给了你更多的灵活性,字节只有在你把它们放进去的情况下才能节省空间,即使这样,节省的空间也不会很明显,除非你有数百万这样的对象。

现在,你不清楚“减去的数字在哪里”。

如果不能是负的规则是状态问题(而不是“它真的是负的,但显示为零,例如-3加2仍然显示为零,因为它内部是零”),那么在减法发生的点执行该规则。

代码语言:javascript
复制
private void Subtract(int subtrahend)
{
  value = Math.Max(value - subtrahend, 0);
}

如果它在内部应该是负的,但显示为零,那么只需在getter中执行该操作

代码语言:javascript
复制
public byte ByteForSomeReason
{
  get { return Math.Max(value, 0); }
}

或者实际上,在二传手中这样做。你为什么反对setter设置值,我更愿意怀疑他们在这方面做得很好。

票数 2
EN

Stack Overflow用户

发布于 2012-01-13 09:51:44

下面这样如何,其中backing属性是一个int:

代码语言:javascript
复制
    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属性。

例如:

代码语言:javascript
复制
    public int TestValue {get; set; }

    public byte TestValueAsByte
    {
        get
        {
            if (this.TestValue < 0)
            {
                return 0;
            }
            else
            {
                return (byte)this.TestValue;
            }
        }
        set
        {
            this.TestValue = value;
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8844828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档