1

当我编写需要确定一定长度的参数的函数时,我总是使用uint. 因为值是负数是没有意义的。

但我在 .Net 框架中看到了相反的情况(经常)。例如:http: //msdn.microsoft.com/en-us/library/xsa4321w.aspx

将 String 类的新实例初始化为由重复指定次数的指定 Unicode 字符指示的值。

public String(
    char c,
    int count
)

它还指出当 ` count小于零时ArgumentOutOfRangeException抛出an。”

为什么不把count争论变成一个uintthen!?

4

2 回答 2

4

很久以前我有一个类似的问题,虽然更多是针对我自己的界面,而不是核心界面。

简短的回答(由 Eric Lippert 给出,并在其他问题的回答中重复)是:公共语言规范规则规定您不应uint在公共接口中使用,因为并非所有设计用于 .NET 的语言实际上都具有这样的类型。想到像 J# 这样的 Java 衍生产品——Java 只有带符号的整数类型。

于 2013-08-28T05:25:44.143 回答
0

C 中的无符号类型有两个主要用途:

  1. 在某些情况下,当计算超出类型的范围时,具有将“换行”的值很有用。例如,当计算多种散列或校验和时,在忽略溢出的情况下简单地执行一堆加法或乘法比使用过大的变量和/或条件逻辑来防止溢出要方便得多。

  2. 有时,让一个两字节变量能够容纳高达 65,535 而不仅仅是 32,767 的值是有用的;有时将四字节变量增加到 4,294,967,295 很有用,但这种情况不太常见。

在 C 中,需要尝试将 -1 存储到unsigned变量中以存储(没有任何类型的错误或尖叫)当添加到 +1 时将产生零的值。这对于第一个使用场景非常有用;第二个是不可取的,但是由于 C 从未对有符号整数进行任何类型的溢出捕获,因此它可以被认为是对数字(而不是代数环)的计算时会发生坏事的原理的扩展范围。

与 C 不同,C# 支持数字溢出检测,因此可以将其应用于第二种使用方式,同时仍允许第一种使用方式。不幸的是,该确定是基于已检查或未检查的数字上下文,而不是基于变量、参数或值的类型。因此,如果一个方法要接受一个类型的参数,UInt32并且在unchecked上下文中尝试传递一个值 -1 的代码,该方法将把它视为 4,294,967,295 的值。无法将参数标记为“这应该是一个介于 0 和 4,294,967,295 之间的值;如果是其他值,则不管检查/未检查状态如何,请尖叫。因此,让代码接受Int32if 上限为 2,147,483,647会更安全是否足够,否则Int64

于 2015-03-30T15:20:31.883 回答