我以为我理解了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所提到的那样,readonly和const可能更接近你所想的,你不能改变变量的值.
旁注:DateTime是一个Structure,因此是一个值类型,我通过调用dt
'reference' 来误导.但是,我认为dt
仍然只是一个变量'指向'一个不可变对象,变量本身仍然是可变的.感谢dan04指出了这一点.
Bol*_*ock 19
你只是告诉变量dt
引用一个不同的实例DateTime
.在引擎盖下,每次访问它时,DateTime.Now
属性都会生成一个新DateTime
实例.
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的工厂:-)
归档时间: |
|
查看次数: |
8360 次 |
最近记录: |