C# 数据类型完整笔记|值类型 & 引用类型
C# 数据类型完整笔记|值类型 & 引用类型
适合新手入门,搭配通俗类比、代码示例、避坑清单,条理清晰,可直接发布博客
一、两大核心分类:值类型 VS 引用类型
C# 所有数据类型分为 值类型、引用类型,最本质区别:内存存储方式、赋值后的行为差异。
- 值类型
✅ 特点:
变量直接存放数据本身,存储在栈内存。
赋值时完整复制一份数据,两个变量相互独立,修改其中一个不会影响另一个。
包含类型:int、double、float、bool、char、byte、struct(结构体)
📌 代码示例
csharp
运行
int a = 10;
int b = a; // 将10完整复制给b
a = 20;
Console.WriteLine(a); // 20
Console.WriteLine(b); // 10
💡 生活类比
你有一张写着数字10的纸条,复印一张交给别人。你把自己纸条改成20,别人手里的复印件依旧是10,互不干扰。
2. 引用类型
✅ 特点:
变量只存放数据内存地址,真实对象存放在堆内存。
多个变量可以持有同一个地址,指向同一份实体;通过任意变量修改数据,所有变量读取到的内容同步变化。
包含类型:自定义class、string、数组、List集合
📌 代码示例
csharp
运行
Person p1 = new Person();
p1.name = "张三";
Person p2 = p1; // p1、p2保存同一个地址,指向同一个对象
p1.name = "李四";
Console.WriteLine(p2.name); // 输出:李四
💡 生活类比
身份证原件锁在柜子里,你和朋友各自拿着记录柜子编号的纸条。只要原件信息改动,所有人凭借纸条打开柜子看到的都是更新后的内容。
小提示:string是特殊引用类型,拥有不可变性,表现上和普通引用类略有区别。
二、整数类型完整对照表(有符号 / 无符号)
规律:带 u = 无符号(只存≥0 数字);带s开头 = 有符号;位数越高取值范围越大,占用内存越多
表格
类型 位数 符号 取值范围
byte 8 位 无符号 0 ~ 255
sbyte 8 位 有符号 -128 ~ 127
ushort 16 位 无符号 0 ~ 65535
short 16 位 有符号 -32768 ~ 32767
uint 32 位 无符号 0 ~ 4294967295
int 32 位 有符号 -2147483648 ~ 2147483647(最常用整数)
ulong 64 位 无符号 0 ~ 18446744073709551615
long 64 位 有符号 -9223372036854775808 ~ 9223372036854775807
⚠️ 常见报错原因
数值超出取值范围 → 编译直接标红;
无符号类型(byte/uint/ulong等)不能赋值负数。
三、浮点小数类型(3 种)
- float 单精度浮点
占用:4 字节
规则:常量末尾必须加 f/F
csharp
运行
float num = 3.14f;
适用:对精度要求不高,追求节省内存场景 - double 双精度浮点
占用:8 字节
C# 默认小数类型,无需后缀
csharp
运行
double d = 1.23456789;
适用:日常开发、游戏、普通科学计算 - decimal 高精度十进制
占用:16 字节
规则:常量末尾必须加 m/M
csharp
运行
decimal money = 99.99m;
✅ 重点:专门用于金额、财务计算,规避浮点精度丢失问题
四、基础简单类型补充 - bool 布尔类型
仅两个取值:true(真)、false(假)
csharp
运行
bool flag = true;
⚠️ C# 和 C/C++ 不同!禁止直接使用数字赋值 bool x = 1; 编译报错。
用途:条件判断、状态开关 - char 字符类型
使用单引号 ' '包裹,只能存放单个字符
csharp
运行
char c1 = 'a';
char c2 = '5';
char c3 = '中';
区分:
char 'a' = 单个字符
string "a" = 字符串(引用类型,双引号)
五、枚举 enum(高频重点)
作用
限制变量只能选取预先定义好的值,规范代码,防止随意赋值。例如:性别、任务状态、关卡类型。
✍ 语法规范
枚举定义写在 class 内部、Main 方法外面,不能写在方法里面!
命名规范:大驼峰(首字母大写)
默认底层数值:从 0 开始依次递增
完整示例:
csharp
运行
// 定义枚举(类内,方法外)
enum Sex
{
Man, // 默认 0
Woman // 默认 1
}
static void Main(string[] args)
{
Sex userSex = Sex.Man;
Console.WriteLine(userSex); // 输出文本:Man
// 枚举与int强制转换
int num = (int)userSex;
Console.WriteLine(num); // 输出底层数字:0
}
枚举速记:
展示给开发者是文字,底层存储数字;
正常赋值格式:枚举名.成员,不要直接写数字;
想要数字和枚举互相转换,必须强制类型转换。
六、新手避坑清单 ⚠️
数字超出类型取值范围 → 编译报错;
无符号类型不能赋值负数;
float 常量必须带后缀 f;
decimal 常量必须带后缀 m;
C# 不允许数字直接赋值给 bool;
char 单引号、string 双引号,不要混用;
enum 不能定义在 Main 方法中;
所有执行代码写在 static void Main() 入口方法内。
七、程序结构小知识点
csharp
运行
class Program
{
// 枚举、结构体、类:写在这里(类内,方法外部)
static void Main(string[] args)
{
// 变量创建、业务执行代码统一写在此处
}
}
额外给你两个可选方案
如果你需要 Markdown 纯净版(直接复制到 CSDN / 掘金 / 博客园),我可以输出无多余格式;
如果你想要 更活泼标题 + 分割线 + emoji 排版 的博文最终成品,我可以再微调文风。

浙公网安备 33010602011771号