# 值类型和引用类型 概念: - 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]] #基础