似乎无符号整数对方法参数和类成员非常有用,它们永远不应该是负数,但我没有看到很多人以这种方式编写代码。我自己尝试过,发现需要从int转换为uint有点烦人......
无论如何你对此有什么看法?
答案 0 :(得分:6)
这个想法,即unsigned会阻止你处理那些不应该处理负值的方法/成员的问题,这有点有些缺陷:
处理位时使用无符号。但是今天不要使用比特,除非你有很多这样的比特,它们填满了几兆字节或者至少你的小嵌入式内存。
答案 1 :(得分:4)
使用标准版可能会避免转换为无符号版本。在你的代码中,你可以保持区别好,但很多其他输入和第三方库不会,因此演员会让人疯狂!
答案 2 :(得分:3)
我不记得C#是如何进行隐式转换的,但在C ++中,扩展转换是隐式完成的。无符号被认为比签名更宽,因此这会导致意想不到的问题:
int s = 5;
unsigned int u = 25;
// s > u is false
int s = -1;
unsigned int u = 25;
// s > u is **TRUE**! Error error!
在上面的例子中,s溢出,所以它的值将是4294967295之类的。这之前我遇到了问题,我经常有方法返回-1来说“不匹配”或者类似的东西,并且隐式转换它只是没有做我认为应该做的事情。
经过一段时间,程序员学会了几乎总是使用签名变量,除非在特殊情况下。这些天的编译器也会为此发出警告,这非常有用。
答案 3 :(得分:3)
一个原因是引用无符号类型的公共方法或属性不符合CLS。
您几乎总是会看到此属性应用于.Net程序集,因为默认情况下各种向导都包含它:
[assembly:CLSCompliant(true)]
所以基本上如果您的程序集包含上面的属性,并且您尝试在公共接口中使用外部世界的无符号类型,则会出现编译错误。
答案 4 :(得分:2)
没有实际需要。声明一些没有签名的数字应该是正面的,这是一个可怜的勒芒尝试验证。
事实上,只有一个代表所有数字的数字类别会更好。
要验证数字,您应该使用其他技术,因为通常约束不仅仅是正数,而是设定范围。通常最好使用最无约束的方法来表示数字,然后如果要更改允许值的规则,则更改JUST验证规则而不是类型。
答案 5 :(得分:2)
为简单起见。现代软件涉及足够的演员阵容和转换。坚持尽可能少的常用数据类型可以降低合适接口的复杂性和模糊性。
答案 6 :(得分:1)
未记录的数据类型是从memomry溢价的过去开始的。所以现在我们并不真的需要它们。将它与铸造相结合,它们有点麻烦。
答案 7 :(得分:1)
不建议使用无符号整数,因为如果你为它分配负值,那么所有的地狱都会失败。但是,如果你坚持以正确的方式进行操作,请尝试使用Spec#,将其声明为整数(您将使用uint)并附加一个不变量,表示它永远不会是负数。
答案 8 :(得分:0)
你是对的,因为使用uint来做永远不会消极的事情可能会更好。但实际上,有几个理由反对它:
答案 9 :(得分:0)
最大的原因是人们通常过于懒惰,或者没有足够的思考,知道他们认为合适的地方。像size_t这样的东西永远不会是负数,所以unsigned是正确的。
从签名到无符号的转换可能会充满危险,因为底层架构如何处理符号位的特殊性。
答案 10 :(得分:-1)
你不应该手动施放它,我不认为。
无论如何,这是因为对于大多数应用来说,无关紧要 - 两者的范围都足以满足大多数用途。
答案 11 :(得分:-1)
这是因为它们不符合CLS,这意味着您的代码可能无法按预期在其他.NET框架实现上运行,甚至在其他.NET语言上运行(除非支持)。
如果您尝试传递它们,它也无法与其他系统互操作。就像Java要使用的Web服务,或者调用Win32 API
请参阅SO post原因