10

比如int, long, ushort, uint,short等。

为什么没有短手System.DateTime呢?

4

3 回答 3

27

许多类型与 C# 中的“速记”关键字相关联;例如,System.Int32也可以写intSystem.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 intdouble, 和其他一些。然而,C 最值得注意的是没有bool, long, decimal,objectstring

int我认为我们可以合理地说,包含关键字等的一个理由char是,熟悉 C 和 C++ 的用户可以在 C# 中快速高效地工作。这里的目的是让 C 程序员熟悉这些关键字,但绝对不是让这些关键字具有与它们在 C 中相同的语义。C 没有指定其中任何一个的大小,例如,和强烈建议int成为机器的“自然尺寸”。C# 确实指定了每种类型的确切大小和范围。

所以我认为我们不能合理地说没有简写的理由System.DateTime是因为在 C 中没有。在 C 中也没有stringdecimal

Jason 指出这DateTime不是“C# 语言的一部分”,因此没有关键字。但这完全是在乞求问题!问题本质上是“好的,那么为什么 DateTime 不是 C# 语言的一部分?” 以同样困难的方式回答问题,称为“求题”,此题已被求得彻底。

考虑什么是“基本”类型是有益的。C# 中所有具有关键字的类型在某种程度上都“非常特殊”,除了decimal. 也就是说,底层运行时具有内置的特殊行为object,显然,因为它是通用基本类型。string可能只是一个 的数组char,但它不是;字符串是特殊的。(因为它们可以被实习,它们可以是常量,它们可以存在于元数据中,等等。)整型和二进制浮点类型都在其操作的框架中内置了特殊处理。

但这System.Decimal只是另一种结构类型;它是 128 位整数和大量用户定义的运算符。如果愿意,任何人都可以实现自己的十进制算术类型。但是通过使其成为 C# 语言的一部分来“祝福”System.Decimal它意味着即使它的转换被实现为方法,我们也将它们视为内置转换,而不是用户定义的转换

所以decimal真的很奇怪。它不是运行时的“基本”类型,而是一个关键字。

不过,这带来了一个有趣的观点。System.IntPtrSystem.UIntPtr *是*运行时的基本类型。它们是“指针大小的整数”类型;它们是 C 中的intand的意思unsigned int。尽管这些类型是 .NET 运行时类型系统的基础,但它们并没有得到关键字的祝福。

因此,我们可以拒绝只有“基本”类型才能获得关键字的论点。有获得关键字的非基本类型和没有获得关键字的基本类型,因此基本类型和获得关键字的类型之间没有一对一的关系。

Tigran 认为这些选择是“历史性的”,这是正确的,但实际上并没有回答这个问题。

Hans Passant 正确地指出,明确指定 int 的大小和范围有助于使语言行为保持一致,即使本机整数大小发生变化,并指出DateTime已经设计为“面向未来”。尽管这种分析是正确的,但它并不能解释为什么将小数设为关键字。不用担心机器的“本机十进制大小”将来会发生变化。此外,C# 语言已经指出,尽管 double 将始终占用 8 个字节的存储空间,但 C# 并不要求将 double 的处理限制为仅 64 位精度;事实上,C# 程序经常以 80 位或更多位的精度执行双精度运算。

我认为这些答案中的任何一个都不能成功解决这个问题。那么让我们回到这个问题:

许多类型与 C# 中的“速记”关键字相关联;例如,System.Int32也可以写intSystem.String可以写string。为什么没有简写System.DateTime

这个问题的答案与“为什么 C# 没有实现我喜欢的功能?”形式的每个问题的答案相同。答案是: 我们不需要提供不实现某个功能的理由。功能很昂贵,而且,正如 Raymond Chen 经常指出的那样,默认情况下是未实现的。让一个未实现的特性不实现是不费吹灰之力的。

功能建议一点也不无道理;Visual Basic 在某种意义上被视为DateTime一种特殊类型,如果我们认为值得做这项工作,C# 也可以。但并不是每一个合理的特性都能得到实现。

于 2012-04-08T15:22:05.300 回答
0

C# 语言中 Int32、Int64 等的别名的存在是为了使该语言面向未来。当每个人的台式机都有 256 位内核时,它仍然具有相关性。为了真正实现这一点,大量的 C# 代码隐含地假设int 是 32 位的。但实际上并没有那么难,我将我编写的代码块从 CP/M 转移到 MS-DOS 再到 Windows 3.x 到 Windows NT,而且出乎意料地毫不费力。

这不是 DateTime 的问题。它是面向未来的,直到 10,000 年。我相信并希望到那时机器会理解我的意思,而不是我输入的内容:)

于 2012-04-07T22:41:16.677 回答
0

除了 BCL/.NET 团队的其他人之外,没有人能给出真正的答案,但我认为这只是历史原因,比如类型charfloat......以及它们的“扩展”(如int->uint在评论中提到的),因为其他没有。

我可以对其他.NET Framework type类型提出同样的问题,因为我们string在 .NET 中有简写,但string它是一个引用类型。所以...

希望我得到解释。

于 2012-04-07T22:43:00.380 回答