C# 基本数据类型
目录
一、按核心类别划分(值与引用)
1. 值类型 (Value Types)
2. 引用类型 (Reference Types)
二、按定义方式划分
1. 内置类型(预定义类型)
2. 用户自定义类型
三、其他重要类型
1. 泛型类型 (Generic Types)
2. 动态类型 (dynamic)
3. 指针类型 (Pointer Types)
总结与对比
一、按核心类别划分(值与引用)
1. 值类型 (Value Types)
变量直接包含其本身的数据。分配在栈上(但如果是引用类型的成员变量,则会随对象存在于堆上)。
结构体 (struct)
-
数值类型:包括所有整数类型(
int
,byte
,long
等)、浮点类型(float
,double
)和高精度decimal
。 -
布尔类型 (bool):
true
或false
。 -
字符类型 (char):表示一个 UTF-16 代码单元。
-
用户自定义结构体:使用
struct
关键字定义。 -
枚举 (enum):用户自定义的一组命名常量,例如
public enum Season { Spring, Summer, Autumn, Winter }
。 -
可空值类型 (Nullable Value Types):在类型后加
?
,允许值类型为null
,如int? nullableInt = null;
。它是System.Nullable<T>
结构的语法糖。
2. 引用类型 (Reference Types)
变量存储的是对数据所在内存地址的引用(指针)。数据本身分配在托管堆上。
-
类 (class)
-
万物之基:
object
(System.Object
),所有类型的基类。 -
字符串:
string
(System.String
),不可变的字符序列。 -
用户自定义类:使用
class
关键字定义。这是最常见的引用类型。
-
-
接口 (interface):使用
interface
关键字定义的一组契约。它本身不是类,但类可以实现接口。 -
数组 (Array):无论元素是值类型还是引用类型,数组本身是引用类型。例如
int[]
,string[,]
。 -
委托 (delegate):一种指向方法的类型,类似于 C/C++ 中的函数指针,但更安全。
二、按定义方式划分
1. 内置类型(预定义类型)
C# 语言直接提供的关键字,如 int
, double
, bool
, char
, string
, object
等。它们实际上是 .NET 类库中类型的别名。
C# 关键字 | .NET 类型(实际类型) | 类别 |
---|---|---|
int | System.Int32 | 值类型 |
double | System.Double | 值类型 |
bool | System.Boolean | 值类型 |
char | System.Char | 值类型 |
string | System.String | 引用类型 |
object | System.Object | 引用类型 |
2. 用户自定义类型
程序员根据需求自己定义的类型。
-
class
:定义类。 -
struct
:定义结构体。 -
interface
:定义接口。 -
enum
:定义枚举。 -
delegate
:定义委托。
三、其他重要类型
1. 泛型类型 (Generic Types)
允许在定义类、接口、方法时使用类型参数(如 T
),从而创建可适用于多种数据类型的、类型安全的代码。
-
例如:
List<T>
,Dictionary<TKey, TValue>
,以及自定义的MyClass<T>
。
2. 动态类型 (dynamic)
在编译时绕过类型检查,在运行时再解析类型。主要用于与 COM API、动态语言(如 IronPython)交互等场景。
-
声明:
dynamic dynVar = "This can be anything";
3. 指针类型 (Pointer Types)
仅在不安全代码块中使用,用于直接操作内存地址。通常用于与底层系统交互或性能极度敏感的场景。
-
声明:
int* p;
(需要使用unsafe
关键字)
总结与对比
特性 | 值类型 | 引用类型 |
---|---|---|
存储内容 | 数据本身 | 数据的引用(内存地址) |
内存位置 | 栈(通常) | 堆 |
赋值操作 | 复制数据,创建独立副本 | 复制引用,指向同一对象 |
参数传递 | 默认按值传递(传递副本) | 默认按引用传递(传递引用的副本) |
内存管理 | 栈回收自动释放,高效 | 由垃圾回收器(GC) 管理 |
默认值 | 0 , false 等 | null |
示例 | int , struct , enum | string , class , array |