Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果DateTime是不可变的,那么为什么下面的操作会起作用?_C#_.net_Datetime - Fatal编程技术网

C# 如果DateTime是不可变的,那么为什么下面的操作会起作用?

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键时,它会显示下一次。。。我认为这是不可能的,我需要创建一个新对象。为什么这是允许的/有效的?或者,我正在使用的那本书是不是写

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

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
a
struct
而不是
class
?@ZachL,底部的澄清是有帮助的,但是最好重写您的答案,这样就不需要开始澄清了,可能是“但不是变量
dt
中存储了什么对象”