如果DateTime是不可变的,为什么以下工作?

Wil*_*Wil 21 .net c# datetime

我以为我理解了Immutable的含义,但是我不明白为什么以下编译和工作:

DateTime dt = DateTime.Now;

Console.WriteLine(dt);
Run Code Online (Sandbox Code Playgroud)

复制并粘贴下一部分几次

dt = DateTime.Now;
Console.WriteLine(dt);
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它会运行,当我按下回车键时,它会在下次显示...我认为这是不可能的,我需要创建一个新对象.为什么允许/工作?或者,这本书我的工作是错误的,而且DateTime不是不可变的(但是我已经在几个来源上读过这个)?

Zac*_*h L 45

DateTime对象本身是不可变的,但不是参考DT.允许dt更改DateTime它指向的对象.不变性指的是我们无法改变DateTime对象内部变量的事实.

例如,我们不能去

dt.Day = 3;
Run Code Online (Sandbox Code Playgroud)

dt本身只是一个指向DateTime对象的引用变量.根据其定义,允许变化.

正如pst所提到的那样,readonlyconst可能更接近你所想的,你不能改变变量的值.


旁注:DateTime是一个Structure,因此是一个值类型,我通过调用dt'reference' 来误导.但是,我认为dt仍然只是一个变量'指向'一个不可变对象,变量本身仍然是可变的.感谢dan04指出了这一点.

  • 也许提一下`readonly`或`const`(虽然这些修饰符只适用于成员). (3认同)
  • 不是`DateTime`是`struct`而不是`class`? (3认同)

Bol*_*ock 19

你只是告诉变量dt引用一个不同的实例DateTime.在引擎盖下,每次访问它时,DateTime.Now属性都会生成一个新DateTime实例.

  • @Wil:您可以更改变量,但不能更改变量指向的变量.作为类比,你可以在某物上粘贴标签,将标签拿出来粘贴在其他东西上,但你不要改变标签附着的东西,只有标签所在的地方. (8认同)

xan*_*tos 5

Now属性类似于:

 DateTime Now {
     get {
         // Get the OS time
         return new DateTime(year, month, day, hour, min, sec...)
     }
 }
Run Code Online (Sandbox Code Playgroud)

(技术上是错误的,Now在内部调用调用操作系统的UtcNow :-),但你得到了这个想法).

DateTime.Now是DateTime的工厂:-)