1

可能重复:
为什么 .Net Framework 不使用无符号数据类型?

C# 编程语言(涵盖 C# 4.0)(第 4 版)中,1.3 类型和变量,第 9 页。

乔恩斯基特说;

万岁字节是无符号类型!在 Java 中,一个字节是有符号的(并且没有无符号的等价物)这一事实使得很多毫无意义的位旋转容易出错。很可能我们都应该比我们更多地使用 uint,请注意:我相信许多开发人员在需要整数类型时会默认使用 int。框架设计者当然也属于这一类:为什么要对 String.Length 进行签名?

当我反编译String.Length时;

/// <summary>
    /// Gets the number of characters in the current <see cref="T:System.String"/> object.
    /// </summary>
    /// 
    /// <returns>
    /// The number of characters in the current string.
    /// </returns>
    /// <filterpriority>1</filterpriority>
    [__DynamicallyInvokable]
    public int Length { [SecuritySafeCritical, __DynamicallyInvokable, MethodImpl(MethodImplOptions.InternalCall)] get; }

也在MSDN中;

Length 属性返回此实例中 Char 对象的数量,而不是 Unicode 字符的数量。原因是一个 Unicode 字符可能由多个 Char 表示。

它返回当前字符串中字符对象的数量。为什么当已经有一个类型时String.Length返回?和的意义何在?Int32UInt32signed-unsigned byteString.Length

4

2 回答 2

11

因为所有 .NET 核心对象都符合 CLS。CLS 没有无符号数据类型。

查看

为什么 unsigned int 不符合 CLS?

详情。

于 2013-01-03T21:02:31.827 回答
10

Int32被广泛认为是 .NET 框架中的“通用”整数。如果您需要一个非小数的一般数字,那么您首先需要的是Int32。如果您有特定的理由,您只会使用其中一种无符号类型。

对所有 Count 属性使用int会创建一致的 API,并允许使用 -1 作为标志值(框架中的某些 API 会这样做)。

来自http://blogs.msdn.com/b/brada/archive/2003/09/02/50285.aspx

我们许多人的普遍感觉是,绝大多数编程都是使用有符号类型完成的。每当您切换到无符号类型时,您都会强制转换心智模型(以及丑陋的演员表)。在最糟糕的情况下,您构建了一个采用无符号类型的 API 的整个并行世界。

于 2013-01-03T21:01:31.300 回答