为什么流.写而不是取int型

本文关键字:int 为什么 | 更新日期: 2023-09-27 17:51:21

对我来说,这似乎非常不合逻辑。Write使用int,而不是UInt…对于这个事实,除了"遗留"代码之外,还有其他解释吗?有人想写-1字节吗?!?

为什么流.写而不是取int型

Unsigned类型不兼容cls,因此Stream.Write不使用uint进行偏移量和计数。

参见:uint (c# Reference)

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

有一篇老文章:为什么我们在CLS中没有unsigned类型,Brad Abrams (2 Sep 2003)解释了原因:

然而,有一个问题不断出现:为什么我们不允许unsigned类型(UInt32等)在CLS?

这个问题实际上有两个答案首先某些语言(如VB.NET)不提供对无符号类型。例如,你不能在VB.NET…但公平地说,这并不是一个完全令人满意的答案因为当我们开始使用CLS时,你不能在VB中创建子类。网都不是,但我们扩展了这种语言来支持我们认识的人将想要的。我们也可以对无符号类型做同样的事情。但我们没有。为什么不呢?还有一个更深层次的原因。事实上这和c#语言早期测试版不支持的原因是一样的无符号类型(没有ushort、uint等)。

总体感觉我们许多人的一个共同点是,绝大多数编程都是通过完成的带有符号的类型。当你切换到无符号类型时,你强制a思维模式的转换(和一个丑陋的角色)。在你构建的最糟糕的cast中创建了一个采用无符号类型的api的并行世界。的值避免使用"<0"检查不值得包含泛型CLS。

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

还有一件事(可能不相关)要添加,Stream.Write实现有负值检查:

[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"));

仅限MSDN

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

所以Stream.Write使用int来表示偏移量和计数

ShuggyCoUk给出的原因更清楚了:

  • int不兼容CLS,因此依赖于它的内置类型(数组)将是有问题的
  • 运行时为最初设计禁止堆上的任何对象占用更多大于2GB的内存。由于数组的最大大小将小于或者等于这个极限的是new byte[int]。MaxValue]应该是令人费解的是,人们能够产生积极的,但非法的数组长度。
      请注意,这个限制在4.5版本中已经被删除了。尽管标准的int长度仍然存在。
  • 历史上c#继承它的大部分语法和约定来自C和c++。在这些数组中简单的指针算术使得负数组索引成为可能(尽管通常是非法和危险的)。因为很多现有的代码假设数组索引为负,这将是一个因子
  • 在C/c++中使用有符号整数作为数组索引意味着可以与这些语言和非托管函数互操作无论如何都需要在这些情况下使用整型,这可能由于不一致而造成混淆。
  • BinarySearch实现(这是许多算法中非常有用的组成部分)依赖于能够使用int的负范围表示该值不存在find 应该插入该值的位置保持排序。
  • 在对数组进行操作时,您可能会将需要对现有索引进行负偏移。如果你使用一个偏移量,它将带你越过数组的开始使用单位然后绕行行为将使索引可能合法(因为它是肯定的)。如果使用int,结果将是非法的(但是安全的,因为运行时将防止读取无效内存)
  • 信不信由你,无符号整数不是公共语言规范(CLS)的一部分。

    MSDN表项:

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

    因此,微软在这里使用int而不是uint,以符合cls。

    相关文章: