为什么函数在逻辑上不能<值时将int作为参数。 0

时间:2013-08-28 05:22:20

标签: .net arguments int uint

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

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

  

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

public String(
    char c,
    int count
)

它还声明当 count 小于零时抛出ArgumentOutOfRangeException。“

为什么不将count参数设为uint呢?

2 个答案:

答案 0 :(得分:4)

我有a similar question ages ago,虽然我的界面更多,而不是核心界面。

简短回答(由Eric Lippert提供,并在answers to other questions中重复)是:公共语言规范规则规定您不应在公共接口中使用uint,因为并非所有语言都是设计用于.NET实际上这样的类型。想到J#这样的Java衍生物--Java只签署了整数类型。

答案 1 :(得分:0)

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

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

  2. 有时候,一个双字节变量能够保存一个高达65,535的值,而不仅仅是32,767;偶尔使四字节变量达到4,294,967,295是有用的,但这种情况要少得多。

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

    与C不同,C#支持数字溢出检测,因此可以将其应用于第二种使用方式,同时仍然允许第一种使用方式。不幸的是,确定是基于检查或未检查的数值上下文,而不是基于变量,参数或值的类型。因此,如果方法接受UInt32类型的参数并且unchecked上下文中的代码试图传递值-1,则该方法将看到值为4,294,967,295。没有办法可以将参数标记为“这应该是介于0和4,294,967,295之间的值;如果是其他任何东西则发出尖叫声,无论是否选中/未选中状态。因此,接受代码更安全如果上限为2,147,483,647就足够Int32,如果不是,则为Int64