C# 的基本类型(primitive types)是语言内置的数据类型,它们直接映射到 .NET 的系统类型,广泛用于程序开发中。理解这些类型,对于高效、健壮的 C# 编程至关重要。
基本类型可以分为两类:值类型和引用类型。
一、值类型(Value Types)
值类型直接存储数据,它们存储在栈上,赋值和参数传递时会复制全部内容。常见的值类型包括数字、布尔值、结构体等。
| C#类型 | .NET类型 | 占用字节 | 取值范围 | 简介 | 示例代码 |
|---|---|---|---|---|---|
| sbyte | System.SByte | 1 | -128 ~ 127 | 有符号8位整数 | sbyte a = -10; |
| byte | System.Byte | 1 | 0 ~ 255 | 无符号8位整数 | byte b = 200; |
| short | System.Int16 | 2 | -32,768 ~ 32,767 | 有符号16位整数 | short c = -100; |
| ushort | System.UInt16 | 2 | 0 ~ 65,535 | 无符号16位整数 | ushort d = 500; |
| int | System.Int32 | 4 | -2,147,483,648 ~ 2,147,483,647 | 有符号32位整数 | int e = 1000; |
| uint | System.UInt32 | 4 | 0 ~ 4,294,967,295 | 无符号32位整数 | uint f = 3000; |
| long | System.Int64 | 8 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 有符号64位整数 | long g = 1L; |
| ulong | System.UInt64 | 8 | 0 ~ 18,446,744,073,709,551,615 | 无符号64位整数 | ulong h = 2UL; |
| nint | System.IntPtr | 4/8 | 平台相关(指针大小) | 有符号本机整数 | nint ni = 123; |
| nuint | System.UIntPtr | 4/8 | 平台相关(指针大小) | 无符号本机整数 | nuint nu = 456; |
| float | System.Single | 4 | ~7位小数 | 单精度浮点数 | float f = 3.14f; |
| double | System.Double | 8 | ~15-16位小数 | 双精度浮点数 | double d = 2.718; |
| decimal | System.Decimal | 16 | 28-29位小数 | 高精度十进制数 | decimal m = 1.23m; |
| bool | System.Boolean | 1 | true/false | 逻辑布尔类型 | bool flag = true; |
| char | System.Char | 2 | Unicode字符(0~65535) | 单一Unicode字符 | char ch = 'A'; |
| C#类型 | .NET类型 | 简介 | 示例代码 |
|---|---|---|---|
| enum | (自定义) | 枚举类型 | enum Day { Mon, Tue } Day today = Day.Mon; |
| struct | (自定义 struct) | 用户自定义结构体 | struct Point { int X; int Y; } |
| record struct | (自定义 record struct) | 记录结构体(不可变/值类型) | public record struct R(int X); |
| Tuple | System.ValueTuple | 值元组类型 | var t = (1, "A"); |
| 可空类型 | System.Nullable | 支持null的值类型 | int? n = null; |
二、引用类型(Reference Types)
引用类型存储数据的引用(指向数据的位置)。这些类型的数据存储在堆中,变量之间赋值时传递的是引用。
| C#类型 | .NET类型 | 简介 | 示例代码 |
|---|---|---|---|
| string | System.String | 不可变字符串 | string s = "hi"; |
| object | System.Object | 所有类型的基类 | object o = 123; |
| dynamic | System.Object | 动态类型,运行时绑定 | dynamic d = "abc"; |
| class | (自定义 class) | 引用类型对象 | class C { } C x = new C(); |
| record | (自定义 record) | 记录类型(不可变/引用类型) | public record Person(string Name); |
| 接口 | (自定义 interface) | 行为约定 | interface I { } |
| 数组 | T[] | 引用类型,元素类型可为任意 | int[] arr = {1,2,3}; |
| 委托 | System.Delegate | 封装方法引用 | Action a = () => { }; |
- string 是一个特殊的引用类型,用于表示文本数据。它是一个不可变的类型,因此每次修改字符串都会创建一个新对象。对于大量拼接字符串,推荐使用 StringBuilder。
三、总结
- 值类型:效率高,适合简单、小型、频繁创建销毁的数据。
- 引用类型:更灵活,适合复杂、可共享、生命周期长的对象,但可能涉及更多内存管理。
- 值传递:值类型赋值会复制全部数据,互不影响。
- 引用传递:引用类型赋值仅复制地址,多个变量可指向同一对象。
- 内存管理:值类型通常存储在栈上,引用类型存储在堆上。
- 装箱与拆箱:值类型转object/interface时会装箱,频繁装箱影响性能,泛型可规避。
- 类型安全:C#是一种强类型语言,类型错误通常在编译时捕获,这有助于减少运行时错误。可空值类型(如int?)降低空引用异常;C# 8+ 推荐开启可空引用类型(如:string?),提升代码健壮性。
本文整理了目前C#常见的基本类型表格,有些重要的类型接下来会单独写文章继续总结。