C# 为什么我们需要Datetime和Datetime?

C# 为什么我们需要Datetime和Datetime?,c#,.net,C#,.net,我想知道我们可以通过Datetime为Datetime分配null吗?可以为null那么为什么我们需要C中的这两个东西,我们可以停止这个Datetime并生成Datetime?作为我们的默认数据类型,无论出于何种原因,我们仍在关注这两个问题,如果您有两个问题,您应该将其作为两个问题发布。您的问题1已在评论中得到回答 至于第二个问题。如果希望DateTime在默认情况下接受null,则会引起框架中的更改,这是一种值类型。如果希望DateTime接受null而不声明DateTime?,则需要将其设置

我想知道我们可以通过Datetime为Datetime分配null吗?可以为null那么为什么我们需要C中的这两个东西,我们可以停止这个Datetime并生成Datetime?作为我们的默认数据类型,无论出于何种原因,我们仍在关注这两个问题,如果您有两个问题,您应该将其作为两个问题发布。您的问题1已在评论中得到回答

至于第二个问题。如果希望DateTime在默认情况下接受null,则会引起框架中的更改,这是一种值类型。如果希望DateTime接受null而不声明DateTime?,则需要将其设置为类,而不是结构

框架作者为数据结构选择尽可能多的struct,以尽可能避免开销。struct是一种值类型,如int、long、byte、live-on-the-stack,所以与类相比,它不会分配内存


因此,很难协商将DateTime作为类而不是结构。否则,C1.0将只是Visual Studio的外衣中的Java:C的前提之一是让开发人员可以在值类型struct、int、long、byte和引用类型class之间进行选择,从而使其比Java更快?我的如果你不想要空的?这就足够了:MyStruct-mine,那么这将是一个错误mine=null,这也是一个错误:MyStruct-mine=null在您的更改中,注释//nota-error仍然存在。现在这将是一个编译器错误。在此处测试您的更改:我的代码有此错误:错误CS0037:无法将null转换为'MyStruct',因为它是一个值类型是的,很抱歉,现在我的vs检测到一个错误,这完全不相关。我将删除该问题。顺便说一句:能够分配null没有听起来那么好。发明它的托尼·霍尔(Tony Hoare)有一个著名的名字叫它。现在甚至要引入,这反过来会导致将null赋值给一个普通引用类型throw或至少warn的变量。可为null的值类型也是值类型,与不可为null的值类型具有相同的堆栈/堆行为。。。并不是说值类型总是存在于堆栈上。更重要的是,在大多数情况下,您不希望null作为一个可能的值。大多数情况下,您也不希望null作为引用类型的可能值,因此在C 8中会发生更改。@jonsket是的,可为null的值类型也是值类型。我在Michal的答案删除的答案上贴了一条关于C的可空代码的评论,说明尽管接受null,但可空是一个结构。在C8中,事情变得更加模糊,因为将有一个称为非空引用类型的原则,可以由编译器开关强制执行?。在C 1.0中很容易解释,可为null的是引用类型,不可为null的是值类型。当然,事情需要改进和发展,以满足开发人员的需要,所以旧的文献不能完全依赖于它们。不清楚为什么你得到了你的答案的后半部分。OP不是问为什么值类型存在,而是问为什么值类型在默认情况下不可为空。除了不破坏所有人之外,创建一种默认值类型和引用类型都可以为空的语言是完全可行的。你的大部分答案都是关于为什么不在所有事情上都使用类?这是另一个问题。在C8中,不可为null的引用类型在执行时并没有真正强制执行。如果编译器认为您试图对不可为null的类型使用可能为null的值,但IL不会更改,则会发出警告。类型系统的其余部分没有强制执行的方式。我倾向于将其视为乐观类型,而在C8中,不可为null的引用类型在执行时并不真正强制执行。是的,事实上它感觉就像一根短绒。如果它可以在执行时强制执行,我们就根本不需要catchNullReferenceException ex。创建一种默认值类型和引用类型都为空的语言是完全可行的。这是一个好主意,如果C可以重新启动,结构(例如DateTime)可以在默认情况下设置为null,但是我们必须考虑如何将null结构设置为非null,无论如何语法都是一个小问题。