C# 如果DateTime是不可变的,那么为什么下面的操作会起作用?
我想我理解了Immutable的含义,但是我不明白为什么下面的编译和工作:C# 如果DateTime是不可变的,那么为什么下面的操作会起作用?,c#,.net,datetime,C#,.net,Datetime,我想我理解了Immutable的含义,但是我不明白为什么下面的编译和工作: DateTime dt = DateTime.Now; Console.WriteLine(dt); 复制并粘贴下一部分几次 dt = DateTime.Now; Console.WriteLine(dt); Console.ReadLine(); 正如预期的那样,它会运行,当我按enter键时,它会显示下一次。。。我认为这是不可能的,我需要创建一个新对象。为什么这是允许的/有效的?或者,我正在使用的那本书是不是写
DateTime dt = DateTime.Now;
Console.WriteLine(dt);
复制并粘贴下一部分几次
dt = DateTime.Now;
Console.WriteLine(dt);
Console.ReadLine();
正如预期的那样,它会运行,当我按enter键时,它会显示下一次。。。我认为这是不可能的,我需要创建一个新对象。为什么这是允许的/有效的?或者,我正在使用的那本书是不是写错了,DateTime不是一成不变的(不过我已经从几个来源读过了)?您只是告诉变量
dt
引用另一个DateTime
实例。在引擎盖下,DateTime.Now
属性每次访问时都会生成一个新的DateTime
实例。对象本身是不可变的,但不是引用dtdt允许更改它指向的DateTime
对象。不变性是指我们不能更改DateTime
对象中的变量
例如,我们不能去
dt.Day = 3;
dt本身只是指向DateTime
对象的参考变量。根据它的定义,它是允许变化的
但是,正如前面提到的,它们可能更接近您的想法,即您无法更改变量的值
旁注:是一个,因此是一个,我把
dt
称为一个“引用”,这是一种误导。然而,我认为dt
仍然是一个变量,指向一个不可变的对象,变量本身仍然是可变的。感谢您指出这一点。Now属性类似于:
DateTime Now {
get {
// Get the OS time
return new DateTime(year, month, day, hour, min, sec...)
}
}
(从技术上讲是错误的,Now在内部调用调用操作系统的UtcNow:-),但您明白了)
DateTime。现在是DateTime的工厂:-)请参阅
阅读所有这些方法的说明。它总是说“返回一个新的日期时间…”。它不会更改当前的DateTime对象,因此它是不可变的
变量引用是另一回事。将其视为指向实际不可变DateTime对象的指针,该对象可以更改为指向另一个对象。如果非平凡结构类型的实例存储在可写存储位置(非只读字段、局部变量、数组插槽等),则其所有字段都是可变的。如果实例存储在不可写的存储位置(一个
只读
字段、一个编译器生成的临时值等),那么它的任何字段都是不可变的。“不可变结构类型”的概念用词不当,因为:
myStruct1 = myStruct2; // Assume variables are of the same structure type
如果myStruct1
是可写的,则将myStruct1
的所有公共和私有字段替换为myStruct2
的相应字段;如果myStruct1
不可写,则该语句将生成编译时错误。该结构的代码在这件事上没有发言权,甚至不会被通知分配已经发生
虽然
DateTime
除了通过整体结构赋值外,没有提供任何方法可以修改现有的DateTime
实例,但它无法防止代码用另一个实例的内容覆盖一个实例的字段,就像dateTimeVariable=DateTime.Now代码>答案很简单。日期时间不是一成不变的。它是一个结构。我不知道怎么可能有一个不可变的结构
如果您这样做:
DateTime d1 = DateTime.Now;
DateTime d2 = DateTime.Now;
d1 = d2;
然后,结构d1将被d2的值覆盖
(DateTime实际上只有一个值。如果运行反编译器,我相信它是一个名为“ticks”的私有字段。)
没有参考资料,也没有任何其他有趣的东西。ahhh-所以我误解了它的意思。。。我的对象是可变的,它的来源是。现在/时间/日期不是(我想我明白了,我只是无法解释…)@Wil:你可以改变变量,但不能改变变量指向的是什么。作为类比,您可以将标签粘贴在某物上,取出标签并粘贴在其他物体上,但您不会更改标签所附着的物体,只更改标签所在的位置。可能提及readonly
或const
(尽管这些修饰符仅适用于成员).很有道理-你和BoltClock都有很好的答案,所以在8分钟内,我将掷硬币!这与速度无关!!!你的文章首先更详细(两个都投了赞成票)-我只是希望我能接受这两个,所以一枚硬币是最公平的!是不是DateTime
astruct
而不是class
?@ZachL,底部的澄清是有帮助的,但是最好重写您的答案,这样就不需要开始澄清了,可能是“但不是变量dt
中存储了什么对象”