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

C# 当我们使用new关键字创建新的DateTime(对象)时,c#,C#,这两者有什么不同 DateTime thisTime = new DateTime(); 还有这个 DateTime thisTime; 谁是更好的表现,谁是更好的实践。对于开始时间,创建的日期时间相同。我使用ThistTime从有8000行的文件中添加dateTime,方法是ParseExact()。我将首先用不同的类型解释这一点,稍后您将看到原因 string myString; 这是一个变量声明。它在内存中分配一些空间,以便能够容纳string对象。但是,它不会用任何内容填充该空间。

这两者有什么不同

DateTime thisTime = new DateTime();
还有这个

DateTime thisTime;

谁是更好的表现,谁是更好的实践。对于开始时间,创建的日期时间相同。我使用ThistTime从有8000行的文件中添加dateTime,方法是ParseExact()。

我将首先用不同的类型解释这一点,稍后您将看到原因

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

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

string myString = "foo";
这结合了以上两种方法,并直接初始化声明的变量


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

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

通常,这是通过使用
default(TypeName)
实现的,例如
default(DateTime)
(这也适用于引用类型,例如返回
null的
default(string)
)。对于值类型,
default(DateTime)
恰好与
newdatetime()相同

然而,C#编译器通常会强制您在使用变量之前显式初始化变量。因此,即使从技术上讲,如果没有明确设置一个值,编译器也会抱怨内存将预先填充默认值

因此,如果您这次想使用
,您必须给它赋值。但是,如果仍要指定完全不同的值,则不必为其指定默认值。因此,如果您计划稍后使用
ParseExact
来获取日期时间,则只需将变量保持未初始化状态,直到您分配它

例如


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

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

不同的方式是:
DateTime
DateTime thisttime=new DateTime()
DateTime thisTime=默认值(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
}

我们在创建类型实例时使用new关键字。对于值类型,这不是强制性的,但对于引用类型
ParseExact
需要一个out参数,因此其用法就像您有一个输入,您需要一个
DateTime
输出。
DateTime thisTime;
if (DateTime.TryParseExact("Inputted Date", "Date Format", 
                System.Globalization.CultureInfo.InvariantCulture,
                DateTimeStyles.None, out thisTime))
{
    //success code
}
else
{
    //failure code
}