C# 如果值为负值,则字节属性应为0?
我对字节属性有问题。 如果减去一个将数字设置为0以下的量,我希望属性为0 我的问题是,在一个属性中,我只得到计算已经完成的值字段,该值不是负值,而是从字节的最大值中减去的负值 将属性类型更改为sbyte不是选项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 {
如果不编写显式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:谢谢您指出这一点。我很少使用字节,所以没有意识到