值类型和引用类型
C#把数据类型分为两种
- 值类型
- 引用类型
值类型和引用类型存储在内存的不同地方。
值类型存储在栈(stack)中,直接存储其值。
引用类型存储在托管堆(managed heap)上,存储对值的引用。
例如值类型:
1 // i和j的值会在内存的两个地方被存储 2 int i = 20; 3 int j = i; 4 // 修改 j 5 j = 21; 6 // 输出 i 和 j 7 Console.WriteLine($"i = {i}"); // 输出 i = 20 8 Console.WriteLine($"j = {j}"); // 输出 j = 21 9 // i没因j的修改而改变自身的值(依然等于20),验证了i和j被存储到了内存的两个地方.
例如引用类型
// 定义一个User类(类属于引用类型) public class User { public string Id { get; set; } public string Name { get; set; } public User(string id, string name) { Id = id; Name = name; } } //使用: 创建一个用户 var user1 = new User("1", "张三"); // 再创建一个用户2直接赋值等于user1 var user2 = user1; // 修改用户2的名字为李四 user2.Name = "李四"; //输出用户1和用户2的名字 Console.WriteLine($"user1.Name = {user1.Name}"); // 输出:user1.Name = 李四 Console.WriteLine($"user2.Name = {user2.Name}"); // 输出:user2.Name = 李四 // 会发现两个用户的名字都成了李四了 // 因为直接将user1赋值给了user2,但最终两个都是指向了内存的同一个引用,所以无论用户1和用户2的改变都是改变了同一个引用 所以改变的最终结果也是一样的!