【问题标题】:Why is String.Length signed? [duplicate]为什么要签名 String.Length? [复制]
【发布时间】:2012-12-18 07:15:09
【问题描述】:

可能重复:
Why does .Net Framework not use unsigned data types?

The C# Programming Language (Covering C# 4.0) (4th Edition),1.3 类型和变量,第 9 页。

Jon Skeet 说;

万岁字节是无符号类型!在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 已经存在UInt32 类型时返回Int32signed-unsigned byteString.Length 的意义何在?

【问题讨论】:

    标签: c# .net unsigned signed string-length


    【解决方案1】:

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

    检查

    Why are unsigned int's not CLS compliant?

    了解详情。

    【讨论】:

    • 嗯,不完全是。 byte 符合 CLS,并且未签名。
    • 是的。这是与语言无关的部分,不知何故,并非所有语言都可以处理它们。不过,这很有趣,因为统一类型系统 otoh - 嗯,它很复杂。大转机,这很痛苦,但事实就是如此;)
    【解决方案2】:

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

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

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

    我们很多人的普遍感觉是,绝大多数编程都是使用有符号类型完成的。每当你切换到 无符号类型你强制转换心智模型(和丑陋的演员表)。在 最糟糕的演员,你建立了一个完整的 API 平行世界,需要 无符号类型。

    【讨论】:

    • 好吧,遗憾的是,这不是正确的答案;)见我的;)
    • 感谢您的反对,但您的回答并没有真正使我的回答无效。
    • 业力+1 :-) 我认为这是使用Int32 的合理理由。话虽如此,TomTom 的回答很可能是实际发生的事情,所以我投了你们俩的票。
    • 除非你们中的任何一个都提到了一位实际的 Microsoft 员工,说明他们选择使用它的原因,否则我们只能推测可能的原因。
    • 比 -1 可以用作标志值这一事实更重要的是,毫无疑问Int32 值的减法应该如何工作。给定 UInt32 类型的变量 xy,一种语言可能赋予 x-y 三种可能的含义:产生一个 UInt32 持有结果 mod 4294967296,产生一个 Int64 持有算术正确结果,或者产生一个UInt32,它在为正时保存算术结果,否则抛出异常;唯一可以避免运行时意外的解释是需要升级到Int64,但这会使...
    猜你喜欢
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多