比如int
, long
, ushort
, uint
,short
等。
为什么没有短手System.DateTime
呢?
许多类型与 C# 中的“速记”关键字相关联;例如,
System.Int32
也可以写int
和System.String
可以写string
。为什么没有简写System.DateTime
?
在我回答这个问题之前——或者更确切地说,不回答它——让我们首先注意在 C# 中具有速记的类型。他们是
object
string
sbyte byte short ushort int uint long ulong
char
bool
decimal double float
让我先谈谈其他一些答案。
Mystere Man 正确地指出,其中几个关键字来自 C;C 有int
和相当罗嗦unsigned int
的double
, 和其他一些。然而,C 最值得注意的是没有bool
, long
, decimal
,object
或string
。
int
我认为我们可以合理地说,包含关键字等的一个理由char
是,熟悉 C 和 C++ 的用户可以在 C# 中快速高效地工作。这里的目的是让 C 程序员熟悉这些关键字,但绝对不是让这些关键字具有与它们在 C 中相同的语义。C 没有指定其中任何一个的大小,例如,和强烈建议int
成为机器的“自然尺寸”。C# 确实指定了每种类型的确切大小和范围。
所以我认为我们不能合理地说没有简写的理由System.DateTime
是因为在 C 中没有。在 C 中也没有string
或decimal
。
Jason 指出这DateTime
不是“C# 语言的一部分”,因此没有关键字。但这完全是在乞求问题!问题本质上是“好的,那么为什么 DateTime 不是 C# 语言的一部分?” 以同样困难的方式回答问题,称为“求题”,此题已被求得彻底。
考虑什么是“基本”类型是有益的。C# 中所有具有关键字的类型在某种程度上都“非常特殊”,除了decimal
. 也就是说,底层运行时具有内置的特殊行为object
,显然,因为它是通用基本类型。string
可能只是一个 的数组char
,但它不是;字符串是特殊的。(因为它们可以被实习,它们可以是常量,它们可以存在于元数据中,等等。)整型和二进制浮点类型都在其操作的框架中内置了特殊处理。
但这System.Decimal
只是另一种结构类型;它是 128 位整数和大量用户定义的运算符。如果愿意,任何人都可以实现自己的十进制算术类型。但是通过使其成为 C# 语言的一部分来“祝福”System.Decimal
它意味着即使它的转换被实现为方法,我们也将它们视为内置转换,而不是用户定义的转换。
所以decimal
真的很奇怪。它不是运行时的“基本”类型,而是一个关键字。
不过,这带来了一个有趣的观点。System.IntPtr和System.UIntPtr *是*运行时的基本类型。它们是“指针大小的整数”类型;它们是 C 中的int
and的意思unsigned int
。尽管这些类型是 .NET 运行时类型系统的基础,但它们并没有得到关键字的祝福。
因此,我们可以拒绝只有“基本”类型才能获得关键字的论点。有获得关键字的非基本类型和没有获得关键字的基本类型,因此基本类型和获得关键字的类型之间没有一对一的关系。
Tigran 认为这些选择是“历史性的”,这是正确的,但实际上并没有回答这个问题。
Hans Passant 正确地指出,明确指定 int 的大小和范围有助于使语言行为保持一致,即使本机整数大小发生变化,并指出DateTime
已经设计为“面向未来”。尽管这种分析是正确的,但它并不能解释为什么将小数设为关键字。不用担心机器的“本机十进制大小”将来会发生变化。此外,C# 语言已经指出,尽管 double 将始终占用 8 个字节的存储空间,但 C# 并不要求将 double 的处理限制为仅 64 位精度;事实上,C# 程序经常以 80 位或更多位的精度执行双精度运算。
我认为这些答案中的任何一个都不能成功解决这个问题。那么让我们回到这个问题:
许多类型与 C# 中的“速记”关键字相关联;例如,
System.Int32
也可以写int
和System.String
可以写string
。为什么没有简写System.DateTime
?
这个问题的答案与“为什么 C# 没有实现我喜欢的功能?”形式的每个问题的答案相同。答案是: 我们不需要提供不实现某个功能的理由。功能很昂贵,而且,正如 Raymond Chen 经常指出的那样,默认情况下是未实现的。让一个未实现的特性不实现是不费吹灰之力的。
功能建议一点也不无道理;Visual Basic 在某种意义上被视为DateTime
一种特殊类型,如果我们认为值得做这项工作,C# 也可以。但并不是每一个合理的特性都能得到实现。
C# 语言中 Int32、Int64 等的别名的存在是为了使该语言面向未来。当每个人的台式机都有 256 位内核时,它仍然具有相关性。为了真正实现这一点,大量的 C# 代码隐含地假设int 是 32 位的。但实际上并没有那么难,我将我编写的代码块从 CP/M 转移到 MS-DOS 再到 Windows 3.x 到 Windows NT,而且出乎意料地毫不费力。
这不是 DateTime 的问题。它是面向未来的,直到 10,000 年。我相信并希望到那时机器会理解我的意思,而不是我输入的内容:)
除了 BCL/.NET 团队的其他人之外,没有人能给出真正的答案,但我认为这只是历史原因,比如类型char
,float
......以及它们的“扩展”(如int
->uint
在评论中提到的),因为其他没有。
我可以对其他.NET Framework type
类型提出同样的问题,因为我们string
在 .NET 中有简写,但string
它是一个引用类型。所以...
希望我得到解释。