2026-06-21 09:51:55 +08:00
|
|
|
# 值类型和引用类型
|
2026-04-13 15:40:15 +08:00
|
|
|
概念:
|
2026-06-21 09:51:55 +08:00
|
|
|
- C# 的类型大体分成两类:==值类型== 和 ==引用类型==
|
|
|
|
|
- 值类型变量通常==直接保存数据本身==
|
|
|
|
|
- 引用类型变量保存的是==对象的引用(地址)==
|
|
|
|
|
|
|
|
|
|
常见类型:
|
|
|
|
|
- 值类型:数值类型、`bool`、`char`、`enum`、`struct`
|
|
|
|
|
- 引用类型:`string`、数组、类、接口、委托、`object`、`dynamic`
|
|
|
|
|
|
|
|
|
|
默认值:
|
|
|
|
|
- 数值类型默认值一般是 `0`
|
|
|
|
|
- `bool` 默认值是 `false`
|
|
|
|
|
- `char` 默认值是 `'\0'`
|
|
|
|
|
- `enum` 默认值是 `(枚举类型)0`
|
|
|
|
|
- 引用类型默认值一般是 `null`
|
2026-04-13 15:40:15 +08:00
|
|
|
|
|
|
|
|
使用区别:
|
2026-06-21 09:51:55 +08:00
|
|
|
1. 赋值时
|
|
|
|
|
- 值类型:复制的是数据本身
|
|
|
|
|
- 引用类型:复制的是引用
|
|
|
|
|
2. 传参时
|
|
|
|
|
- 默认也遵循上面的规则
|
|
|
|
|
- 所以值类型通常是“传一份副本”
|
|
|
|
|
- 引用类型通常是“传一份引用”
|
2026-04-13 15:40:15 +08:00
|
|
|
|
|
|
|
|
案例:
|
2026-06-21 09:51:55 +08:00
|
|
|
值类型:
|
|
|
|
|
```csharp
|
|
|
|
|
static void ChangeValue(int value)
|
|
|
|
|
{
|
|
|
|
|
value = 99;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int a = 1;
|
|
|
|
|
ChangeValue(a);
|
|
|
|
|
Console.WriteLine(a); // 1
|
2026-04-13 15:40:15 +08:00
|
|
|
```
|
2026-06-21 09:51:55 +08:00
|
|
|
|
|
|
|
|
引用类型:
|
|
|
|
|
```csharp
|
|
|
|
|
static void ChangeValue(int[] value)
|
|
|
|
|
{
|
|
|
|
|
value[0] = 99;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int[] a = { 1 };
|
|
|
|
|
ChangeValue(a);
|
|
|
|
|
Console.WriteLine(a[0]); // 99
|
2026-04-13 15:40:15 +08:00
|
|
|
```
|
2026-06-21 09:51:55 +08:00
|
|
|
|
|
|
|
|
注意:
|
|
|
|
|
1. ==数组是引用类型,不是值类型==
|
|
|
|
|
2. ==string 也是引用类型==,但它有“不可变”特性
|
|
|
|
|
3. “值类型在栈上、引用类型在堆上”只是初学时的简化理解,==不适合当成绝对规则==
|
|
|
|
|
4. 更稳的记法是:
|
|
|
|
|
- 值类型变量保存值
|
|
|
|
|
- 引用类型变量保存引用
|
|
|
|
|
5. 如果想让方法直接改外部变量本身,要继续看[[ref和out]]
|
|
|
|
|
|
|
|
|
|
#基础
|