当我们使用new关键字创建新的DateTime(对象)时

时间:2015-11-18 06:36:41

标签: c#

这个

有什么不同
DateTime thisTime = new DateTime();

和这个

DateTime thisTime;

谁是更好的表现,谁是更好的习惯。对于开始时,create具有相同的日期时间。我使用 thisTime 从具有8000行的文件中添加dateTime,方法为 ParseExact()

2 个答案:

答案 0 :(得分:4)

我将首先用不同的类型来解释这个问题,稍后你会明白为什么。

string myString;

这是一个变量声明。它在内存中分配一些空间,以便能够容纳string个对象。但是,它不会用任何内容填充该空间。所以变量包含null,这实际上意味着没有对象。

myString = "foo";

这是一个变量赋值。它用一些值填充之前分配的内存。该值是对包含"foo"的字符串对象的引用。这意味着为变量准备的内存位置不包含字符串本身,而只是在其他地方找到它的注释。

string myString = "foo";

这将上述两者结合起来,直接初始化声明的变量。

现在,对于DateTime,这有点不同。 DateTime是一种值类型,这意味着该类型的变量不仅存储引用,而且存储对象的实际内容。另一个简单类型是int,其中变量直接存储整数值。

由于值类型的变量直接包含值,因此它们不是引用,因此它们不能是null。相反,声明的值类型变量将使用该类型的默认值自动初始化。

一般来说,这是通过使用default(TypeName)来实现的,例如default(DateTime)(这也适用于引用类型,例如返回default(string)的{​​{1}}。对于值类型,null恰好与default(DateTime)相同。

但是,C#编译器通常会在您使用它们之前强制执行 explicitely 初始化变量。因此,即使在技术上,内存也会预先填充默认值,如果您没有明确设置值,编译器会抱怨。

因此,如果您想使用new DateTime(),则必须为其指定值。但是,如果您计划分配完全不同的值,则不必为其分配默认值。所以,如果你是计划稍后使用thisTime获取DateTime,然后将变量保持为未初始化,直到您分配它为止。

E.g。

ParseExact

答案 1 :(得分:2)

它们都没有区别,它们都在C#中返回默认值DateTime,即1/1/0001 12:00:00 AM,性能方面它们都是相同的。我建议使用第二个选项,因为它使用较少的代码。

在C#中DateTime是一个结构而不是一个类,因此它不能为空,并且无论你如何声明它都将始终默认为1/1/0001 12:00:00 AM。

不同的方式是:DateTime thisTime;DateTime thisTime = new DateTime();DateTime thisTime = default(DateTime);

此外,我建议您使用ParseExact而不是TryParseExact,因此如果字符串与格式不匹配,代码不会抛出异常。

DateTime thisTime;
if (DateTime.TryParseExact("Inputted Date", "Date Format", 
                System.Globalization.CultureInfo.InvariantCulture,
                DateTimeStyles.None, out thisTime))
{
    //success code
}
else
{
    //failure code
}