# 值类型和引用类型
概念：
- C# 的类型大体分成两类：==值类型== 和 ==引用类型==
- 值类型变量通常==直接保存数据本身==
- 引用类型变量保存的是==对象的引用（地址）==

常见类型：
- 值类型：数值类型、`bool`、`char`、`enum`、`struct`
- 引用类型：`string`、数组、类、接口、委托、`object`、`dynamic`

默认值：
- 数值类型默认值一般是 `0`
- `bool` 默认值是 `false`
- `char` 默认值是 `'\0'`
- `enum` 默认值是 `(枚举类型)0`
- 引用类型默认值一般是 `null`

使用区别：
1. 赋值时
	- 值类型：复制的是数据本身
	- 引用类型：复制的是引用
2. 传参时
	- 默认也遵循上面的规则
	- 所以值类型通常是“传一份副本”
	- 引用类型通常是“传一份引用”

案例：
值类型：
```csharp
static void ChangeValue(int value)
{
	value = 99;
}

int a = 1;
ChangeValue(a);
Console.WriteLine(a); // 1
```

引用类型：
```csharp
static void ChangeValue(int[] value)
{
	value[0] = 99;
}

int[] a = { 1 };
ChangeValue(a);
Console.WriteLine(a[0]); // 99
```

注意：
1. ==数组是引用类型，不是值类型==
2. ==string 也是引用类型==，但它有“不可变”特性
3. “值类型在栈上、引用类型在堆上”只是初学时的简化理解，==不适合当成绝对规则==
4. 更稳的记法是：
	- 值类型变量保存值
	- 引用类型变量保存引用
5. 如果想让方法直接改外部变量本身，要继续看[[ref和out]]

#基础
