C# 为什么Stream.Write不带UInt?

C# 为什么Stream.Write不带UInt?,c#,.net,method-signature,cls-compliant,C#,.net,Method Signature,Cls Compliant,在我看来,使用int,而不是UInt。。。除了“遗留”代码之外,还有其他解释吗?有人想写-1字节吗 无符号类型不符合CLS,因此Stream.Write不对偏移量和计数使用uint 见: uint类型不符合CLS。尽可能使用int 有一篇老文章解释了原因: 然而,有一个问题不断出现:我们为什么不允许 CLS中的无符号类型(UInt32等) 这个问题有两个答案一开始 某些语言(如VB.NET)不完全支持 无符号类型。例如,在中不能有无符号文本 VB.NET…。但公平地说,这不是一个完全令人满意的答

在我看来,使用
int
,而不是
UInt
。。。除了“遗留”代码之外,还有其他解释吗?有人想写
-1
字节吗

无符号类型不符合CLS,因此
Stream.Write
不对偏移量和计数使用
uint

见:

uint类型不符合CLS。尽可能使用int

有一篇老文章解释了原因:

然而,有一个问题不断出现:我们为什么不允许 CLS中的无符号类型(UInt32等)

这个问题有两个答案一开始 某些语言(如VB.NET)不完全支持 无符号类型。例如,在中不能有无符号文本 VB.NET…。但公平地说,这不是一个完全令人满意的答案 因为当我们启动CLS时,您无法在VB.NET中创建子类 两者都有,但我们扩展了这种语言来支持我们所认识的人 我会想要的。我们可以对无符号类型做同样的事情。 但我们没有。为什么不呢?这有更深层次的原因。事实上 这也是为什么早期C#语言的Beta不支持 无符号类型(无ushort、uint等)

总体感觉 我们中的许多人认为,绝大多数编程都是完成的 使用有符号类型。无论何时切换到无符号类型,都会强制 心智模型转换(和丑陋的施法)。在你建立的最差施法中 创建了一个采用无符号类型的API的并行世界。价值 避免“<0”检查的方法不值得将泛型包含在 CLS

(请注意,更新版本的VB.Net(VB 8及以后版本)支持无符号类型)

还有一件事(可能无关)需要添加,即检查负值:

[System.Security.SecuritySafeCritical]  // auto-generated
public override void Write(byte[] array, int offset, int count) {
    if (array==null)
        throw new ArgumentNullException("array", Environment.GetResourceString("ArgumentNull_Buffer"));
    if (offset < 0)
        throw new ArgumentOutOfRangeException("offset", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
    if (count < 0)
        throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
    if (array.Length - offset < count)
        throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
[System.Security.SecuritySafeCritical]//自动生成
公共重写无效写入(字节[]数组、整数偏移量、整数计数){
if(数组==null)
抛出新的ArgumentNullException(“array”,Environment.GetResourceString(“ArgumentNull_Buffer”);
如果(偏移量<0)
抛出新ArgumentOutOfRangeException(“offset”,Environment.GetResourceString(“ArgumentOutOfRange_needNonNegnNum”);
如果(计数<0)
抛出新ArgumentOutOfRangeException(“count”,Environment.GetResourceString(“ArgumentOutOfRange_NeedNonNegNum”);
if(array.Length-偏移量<计数)
抛出新的ArgumentException(Environment.GetResourceString(“Argument_InvalidOffLen”);
来自

uint类型不符合CLS。请尽可能使用int

所以
Stream.Write
使用int作为偏移量和计数

报告更清楚地表明:

  • uint不符合CLS,因此使内置类型(数组)依赖于它会有问题
  • 运行时为 最初设计禁止堆上的任何对象占用更多空间 内存小于2GB。因为最大大小的阵列将小于 或等于此限制的将是新字节[int.MaxValue],它将是 让人费解的是,能否生成正的但非法的数组 长度。
    • 请注意,此限制已被取消, 尽管标准长度仍然为int
  • 历史上的C#继承 它的语法和惯例大部分来自C和C++。 简单的指针算法,所以负数组索引是可能的 (虽然通常是非法和危险的)。因为许多现有的代码 假设数组索引为负,这可能是一个因素
  • 另一方面,在C/C++中对数组索引使用有符号整数意味着可以与这些语言和非托管函数进行互操作 无论如何,在这些情况下都需要使用INT,这可能会 由于不一致而混淆
  • 二进制搜索的实现 (许多算法中非常有用的组成部分)依赖于能够 使用int的负范围表示该值未被指定 找到应插入该值的位置 保持分类
  • 在阵列上操作时,很可能 将要采用现有索引的负偏移量。如果使用 一个偏移量,该偏移量将使您通过使用单位的数组起点 然后,环绕行为将使您的索引可能合法 (因为它是正的)。使用int,结果将是非法的(但是 安全,因为运行时可以防止读取无效内存)

信不信由你,无符号整数是

:

uint类型不符合CLS。请尽可能使用int

因此,为了符合CLS,Microsoft在此处使用了
int
,而不是
uint