C# 如果值为负值,则字节属性应为0?

C# 如果值为负值,则字节属性应为0?,c#,properties,byte,C#,Properties,Byte,我对字节属性有问题。 如果减去一个将数字设置为0以下的量,我希望属性为0 我的问题是,在一个属性中,我只得到计算已经完成的值字段,该值不是负值,而是从字节的最大值中减去的负值 将属性类型更改为sbyte不是选项 如果不编写显式setter方法并仅使用getter属性,是否有任何方法可以确保4减5等于0而不是255?如果backing属性是int,那么类似的方法如何: private int m_TestValue; public byte TestValue {

我对字节属性有问题。 如果减去一个将数字设置为0以下的量,我希望属性为0

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

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


如果不编写显式setter方法并仅使用getter属性,是否有任何方法可以确保4减5等于0而不是255?

如果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;
        }
    }
private int m_TestValue;
公共字节测试值
{
得到
{
如果(m_测试值<0)
{
返回0;
}
其他的
{
返回(字节)m_TestValue;
}
}
设置{
m_TestValue=值;
}
}
更新

多亏了32bitkid,我现在意识到上面的解决方案将不起作用,因为在到达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;
        }
    }
public int TestValue{get;set;}
公共字节TestValueAsByte
{
得到
{
if(this.TestValue<0)
{
返回0;
}
其他的
{
返回(字节)this.TestValue;
}
}
设置
{
this.TestValue=值;
}
}

类似这样的情况如何,其中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;
        }
    }
private int m_TestValue;
公共字节测试值
{
得到
{
如果(m_测试值<0)
{
返回0;
}
其他的
{
返回(字节)m_TestValue;
}
}
设置{
m_TestValue=值;
}
}
更新

多亏了32bitkid,我现在意识到上面的解决方案将不起作用,因为在到达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;
        }
    }
public int TestValue{get;set;}
公共字节TestValueAsByte
{
得到
{
if(this.TestValue<0)
{
返回0;
}
其他的
{
返回(字节)this.TestValue;
}
}
设置
{
this.TestValue=值;
}
}

首先,避免将
字节
用于一般积分用途。在
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设置值有什么反对意见,我宁愿怀疑他们会擅长于此。

首先,避免将
字节
用于一般整数使用。在
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设置值有什么意见,我宁愿怀疑他们会擅长于此。

是否将属性类型更改为
int
选项?这是.NET通常所做的。您可能需要查看
checked
关键字。@minitech,
int
不能解决0问题@32位的孩子,
checked
创建了一个异常问题。@AnthonyPegram:实际上,
int
确实解决了这个问题。例外问题?太多了。在这种情况下,这听起来非常特殊。将属性类型更改为
int
是一个选项吗?这是.NET通常所做的。您可能需要查看
checked
关键字。@minitech,
int
不能解决0问题@32位的孩子,
checked
创建了一个异常问题。@AnthonyPegram:实际上,
int
确实解决了这个问题。例外问题?太多了。在这种情况下,这听起来很特别。这个解决方案没有任何意义<代码>foo.TestValue=0;foo.TestValue-=128;AreEqual(foo.TestValue,0)断言失败,因为它实际上等于
128
。因为溢出发生在您的私有m_TestValue的范围之外,并且它刚刚被分配了+128的溢出值。@32bitkid:谢谢您指出这一点。我很少使用字节,所以没有意识到