c# - 为什么有些类型没有文字修饰符

标签 c# literals

例如,为什么 long int 有文字修饰符,而 short int 没有?我指的是本网站上的以下问题:C# compiler number literals

总的来说,C# 似乎是一种设计良好且一致的语言。可能有充分的理由为某些类型提供文字修饰符,但不是所有类型。它是什么?

最佳答案

Why long int has a literal modifier, but short int does not?



问题是“为什么C#没有这个功能?”这个问题的答案总是一样的。默认情况下未实现功能; C# 没有该功能,因为没有人设计、实现并将该功能交付给客户。

没有特征不需要理由。相反,所有功能都必须通过证明其 yield 大于成本来证明其合理性。作为提出该功能的人,您有责任描述您认为该功能有值(value)的原因;我没有责任解释为什么不是。

Probably there is a strong reason to provide literal modifiers for some types, but not for all. What is it?



现在这是一个更容易回答的问题。现在的问题是“什么证明 long 上的字面后缀是合理的,为什么这不是 short 上类似的字面后缀的理由?”

整数可用于多种用途。您可以将它们用作算术数字。您可以将它们用作位标志的集合。您可以将它们用作数组的索引。还有很多特殊用途。但我认为可以公平地说,大多数时候,整数被用作算术数。

由普通程序以整数执行的绝大多数计算涉及的数字远小于 32 位有符号整数的范围——大约 +/- 20 亿。许多现代硬件在单独处理 32 位整数时非常高效。因此,使数字的默认表示为有符号的 32 位整数是有意义的。因此,C# 旨在使涉及 32 位有符号整数的计算看起来完全正常;当你说 "x = x + 1"时,"1"被理解为一个有符号的 32 位整数,并且 x 也是如此,并且总和的结果也是如此。

如果计算是整数但不适合 32 位整数的范围怎么办? “长”64 位整数是明智的下一步;它们在许多硬件上也很有效,并且 longs 的范围应该可以满足几乎所有不进行涉及极大数字的重型组合的人的需求。因此,通过某种方式在源代码中清晰简洁地指定此处的此文字将被视为长整数是有意义的。

互操作方案,或将整数用作位字段的方案,通常需要使用无符号整数。同样,有一种方法可以清晰简洁地指定此文字旨在被视为无符号整数。

因此,总而言之,当您看到“1”时,绝大多数时间用户打算将其用作 32 位有符号整数的可能性很大。下一个最可能的情况是用户希望它是一个长整数或一个 unsigned int 或 unsigned long。因此,每种情况都有简明的后缀。

因此,该特征是合理的。

为什么这不是短裤的理由?

因为首先,在每个 short 合法的上下文中,使用整数文字已经是合法的。 “短 x = 1;”完全合法;编译器意识到整数适合短,并让您使用它。

其次,算术永远不会在 C# 中用 Shorts 完成。算术可以在 int、uint、long 和 ulong 中完成,但算术永远不能在 short 中完成。 Shorts 升级为 int 并且算术是在 int 中完成的,因为就像我之前说的,绝大多数算术计算都适合一个 int。绝大多数不适合短片。在为整数优化的现代硬件上,短算术可能会更慢,而且短算术占用的空间也不小;它将在芯片上以整数或多头完成。

你想要一个“长”后缀来告诉编译器“这个算术需要用longs来完成”,但是“short”后缀不会告诉编译器“这个算术需要用shorts来完成”,因为这根本不是C# 语言开始。

提供长后缀和无符号语法的原因不适用于短后缀。如果您认为该功能有令人信服的好处,请说明好处是什么。如果没有任何好处来证明其成本是合理的,该功能将不会在 C# 中实现。

关于c# - 为什么有些类型没有文字修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8671427/

相关文章:

C# 到 F# 互操作 : How to specify a C# method's optional parameter in F# function type signature?

c# - .NET 中是否有一种功能,方法可以通过该功能确定哪个类调用了它

c# - 数据绑定(bind)到 EF 实体或 ViewModel

javascript - JavaScript Number 是任意精度的数字吗?

C# 逐字字符串文字不起作用。非常奇怪的反斜杠总是加倍

c# - 是否有任何语法可以缩短新 C# 中对象的设置变量

c# - Linq 获取所有控件(有序)

arrays - 如何在 Rust 的全局范围内指定 const 数组?

haskell - 将文字分配给 GHC 中的术语

java - 以编程方式在 java 类中查找文字