不得不说c#的类型系统设计有点意思,不同的编程语言对于类型的设计各有取舍。
当我们将一个int类型的值赋值到另一个int类型的值时,它实际上是创建了一个完全不同的副本。换句话说,如果你改变了其中某一个的值,另一个不会发生改变。C#的所有值类型均隐式派生自System.ValueType
当我们创建一个对象并且将此对象赋值给另外一个对象时,他们彼此都指向了内存中同一块区域。因此,当我们将obj赋值给obj1时,他们都指向了堆中的同一块区域。换句话说,如果此时我们改变了其中任何一个,另一个都会受到影响。
看一段代码:
using System;
using System.Collections.Generic;
namespace ConsoleApp22222
{
class Program
{
static void Main(string[] args)
{
A a1 = new A(3);
List<A> list = new List<A>();
list.Add(a1);
a1.a = 4; // 修改了a1, 但是a1是引用类型,所以修改之后并没有新对象产生
list.Add(a1);
Console.WriteLine("a:");
Console.WriteLine(list[0].a);
B b1 = new B(3);
var list_b = new List<B>();
list_b.Add(b1);
b1.b = 4; // 修改了b1 ,因为b1是struct,值类型,所以修改之后复制了一个struct,并没有改第一个b1。如果不好理解可以看第三段代码
list_b.Add(b1);
Console.WriteLine("b:");
Console.WriteLine(list_b[0].b);
Console.WriteLine(list_b[1].b);
int c = 0;
var list_int = new List<int>();
list_int.Add(c);
c = 2;
list_int.Add(c);
Console.WriteLine("c:");
Console.WriteLine(list_int[0]);
Console.WriteLine(list_int[1]);
}
}
public class A
{
//class 引用类型
public int a;
public A(int a)
{
this.a = a;
}
}
public struct B
{
//struct 值类型
public int b;
public B(int b)
{
this.b = b;
}
}
}
https://zhuanlan.zhihu.com/p/358825256