我们假设我按如下方式初始化DateTime变量。
表达式1
DateTime foo = DateTime.Now;
问题#1我是否只是在没有显式调用构造函数的情况下构造DateTime对象?
问题#2这是否可行,因为.NET开发人员使用自动构建具有日期和时间的DateTime对象的属性设置DateTime Struct?
接下来,如果我使用这种语法
表达式2
DateTime bar = new DateTime();
我已动态创建了DateTime结构。
问题#3除了当我使用表达式2时,我可以指定任何日期(使用不同的构造函数),何时以及为什么使用表达式1而不是表达式2?
由于
黑麦
答案 0 :(得分:2)
您正在使用 static 属性,该属性返回一个新的DateTime实例,其中包含值的当前日期和时间。所以,你没有明确地调用构造函数,但这确实发生在属性执行的某个地方。
没有。它没什么特别的,只是一个静态属性。
Nr 1代表当前日期和时间,nr 2代表您自己指定日期和时间。所以一个人不能取代另一个,他们都有自己的目的。
答案 1 :(得分:2)
是的,你做到了。对于类来说,这很容易,就像结构一样。请考虑以下代码段:
public class MyDateTime
{
public static MyDateTime Now
{
get { return new MyDateTime(); }
}
}
现在有人可以编写MyDateTime.Now
并在没有(显式)使用构造函数的情况下构造该类型的实例。
当然,结构 实际上是特殊的,因为我可以写:
class Foo
{
private DateTime date;
public Foo()
{
Console.WriteLine(date);
}
}
在这个类中,永远不会调用date
的构造函数,但实际存在并构造日期实例,这是因为值类型被初始化为默认值,它等于按位全零。这与手头的问题并不特别相关,但你确实问过。
还值得注意的是,在变量之间分配时会复制结构。考虑一下代码段:
public static void Foo(DateTime input)
{
DateTime copy = input;
}
分配是创建新的DateTime
实例。如果这是用类完成的,它就不会,它只会复制对象的引用,但是每个赋值的值类型,或者将变量的值复制到另一个变量的其他操作是构造一个新的对象
从语言的角度来看,没有什么特别之处。重写Now
属性以构造表示当前时间的实例,即全部。您可以在属性获取器中运行所需的任何代码。
如果您想获取当前时间,而不是硬编码时间,则可以使用DateTime.Now
。
答案 2 :(得分:1)
DateTime.Now
是DateTime
类的静态属性,它根据当前本地时间创建并返回一个新实例。您可以查看其执行的代码here。
你没有明确地调用构造函数,但它并没有什么特别之处。您调用了静态属性, it 根据当前时间实例化DateTime
并将其返回给您。具体来说,它会进行一些检查,然后调用internal DateTime(long ticks, DateTimeKind kind, Boolean isAmbiguousDst)
构造函数,只要当前的滴答计数在DateTime对象的范围内。
DateTime
的范围是#01/01 / 0001 12:00:00 AM#to#12/31/9999 23:59:59 PM#,因此范围检查不太可能进入玩DateTime.Now
。
如果您想要当地时间,请使用DateTime.Now
。如果您需要,请new DateTime()
(无参数构造函数)DateTime.MinValue
。如果要实例化特定时间,请使用各种参数化DateTime
构造函数。