2013-01-03 36 views
1

可能重复:
Why does .Net Framework not use unsigned data types?为什么String.Length被签名?

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

Jon Skeet说;

Hooray字节是一个无符号类型!在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;

长度属性在这种情况下 返回字符对象的数量,不是Unicode字符数。原因是一个 Unicode字符可能由多个Char表示。

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

回答

10

Int32被广泛认为是.NET框架中的“通用”整数。如果你需要一个不是小数的通用数字,Int32是你第一次达到的数字。如果您有特定的理由,您只能使用其中一种未签名类型。

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

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

当中许多人的普遍感觉是,绝大多数的编程与符号类型来完成。无论何时切换到 无符号类型,您都会强制进行思维模型切换(以及丑陋的投射)。在 最糟糕的演员,你建立了一个完整的API并行世界,采取 无符号类型。

+0

那么,可悲的是不是正确的答案;)见我的;) – TomTom

+5

感谢downvote,但你的答案并不真正使我的无效。 –

+0

对于业力+1 :-)我认为这是使用'Int32'的合理理由。话虽如此,TomTom的回答可能是实际发生的事情,所以我投了你们俩。 –

11

因为所有.NET核心对象都符合CLS。 CLS没有未签名的数据类型。

检查

Why are unsigned int's not CLS compliant?

的细节。

+2

嗯,不完全。 'byte'符合CLS,并且没有签名。 –

+0

是的。这是关于独立于语言的部分,并不是所有的语言都可以处理它们。不过,这很有趣,因为统一类型系统otoh - 好,它很复杂。大转机,这是一种痛苦,但事实就是这样);) – TomTom