C#DateTime总是创建新对象?

ret*_*ide 12 c# datetime

为什么在C#中我的两个变量指向不同的DateTime对象?

DateTime a1 = DateTime.Now;
DateTime a2 = a1;

a1 = a1 + TimeSpan.FromMinutes(15);
a2 = a2 - TimeSpan.FromMinutes(16);
Run Code Online (Sandbox Code Playgroud)

我意识到a2实际上指的是一个与a1不同的新对象.

但在其他情况下.假设我有一个人类,年龄= 1;

Person a1 = new Person();
a2 = a1;
a2 = Person.Age = 2;
Run Code Online (Sandbox Code Playgroud)

在Person Case中,a1和a2指向同一个对象.我真的很困惑,有人可以解释一下吗?

Ode*_*ded 28

DateTime 是一种价值类型 - 一种结构.

使用值类型,当您执行以下操作时:

DateTime a2 = a1;
Run Code Online (Sandbox Code Playgroud)

a2获取值的副本a1.它与同一内存位置的引用不同,而是完整的单独副本.

另一方面,Person是一个引用类型 - 一个类.

当你这样做时:

Person p2 = p1;
Run Code Online (Sandbox Code Playgroud)

对于引用类型,p2指向的引用与指向的引用相同p1.因此,一方面的变化都是两者的变化.

请参阅MSDN上的值类型和引用类型.

  • @NomiAli - 为什么不发一个问题呢?值类型通常被创建为不可变的(并且它非常适合它们的语义).由于许多不同的原因,`string`被创建为不可变的(优化是一个).您可以创建不可变的值或引用类型. (2认同)

Oli*_*bes 7

正如其他人已经指出的那样DateTime是一个结构,而不是一个类,因此是一个值类型.如果更改用于显示结构的文本颜色,则可以在Visual Studio编辑器中将其可视化.在菜单Tools>中打开对话框,Options然后导航到Environment>Fonts and Colors

在此输入图像描述

更改委托,枚举,接口和结构(值类型)的颜色很有帮助.

在此输入图像描述