C类型、存储、变量及类的基础知识
立即解锁
发布时间: 2025-08-21 00:06:03 阅读量: 2 订阅数: 8 


C#编程基础与实战技巧
### C# 类型、存储、变量及类的基础知识
#### 1. 预定义类型
C# 中的所有预定义类型都直接映射到基础 .NET 类型,C# 类型名只是 .NET 类型的别名。虽然在语法上使用 .NET 类型名是可行的,但并不推荐,在 C# 程序中应使用 C# 类型名。
预定义的简单类型表示单个数据项,具体信息如下表所示:
| 名称 | 含义 | 范围 | .NET 框架类型 | 默认值 |
| --- | --- | --- | --- | --- |
| sbyte | 8 位有符号整数 | -128–127 | System.SByte | 0 |
| byte | 8 位无符号整数 | 0–255 | System.Byte | 0 |
| short | 16 位有符号整数 | -32,768–32,767 | System.Int16 | 0 |
| ushort | 16 位无符号整数 | 0–65,535 | System.UInt16 | 0 |
| int | 32 位有符号整数 | -2,147,483,648–2,147,483,647 | System.Int32 | 0 |
| uint | 32 位无符号整数 | 0–4,294,967,295 | System.UInt32 | 0 |
| long | 64 位有符号整数 | -9,223,372,036,854,775,808–9,223,372,036,854,775,807 | System.Int64 | 0 |
| ulong | 64 位无符号整数 | 0–18,446,744,073,709,551,615 | System.UInt64 | 0 |
| float | 单精度浮点数 | 1.5×10 - 45–3.4×10 38 | System.Single | 0.0f |
| double | 双精度浮点数 | 5×10 - 324–1.7×10 308 | System.Double | 0.0d |
| bool | 布尔值 | true, false | System.Boolean | false |
| char | Unicode 字符 | U+0000–U+ffff | System.Char | \x0000 |
| decimal | 具有 28 位有效数字精度的十进制值 | ± 1.0×10 28–±7.9×10 28 | System.Decimal | 0m |
非简单预定义类型相对复杂一些。字符串类型的值可以包含零个或多个 Unicode 字符,对象类型是系统中所有其他类型(包括预定义的简单类型)的基类。预定义的非简单类型如下表所示:
| 名称 | 含义 | .NET 框架类型 |
| --- | --- | --- |
| object | 所有其他类型派生自的基类 | System.Object |
| string | 一系列 Unicode 字符 | System.String |
| dynamic | 用于与用动态语言编写的程序集一起使用的类型 |
#### 2. 用户定义类型
除了 C# 提供的 15 种预定义类型外,还可以创建自己的用户定义类型,共有六种类型可以创建:
- 类类型
- 结构体类型
- 数组类型
- 枚举类型
- 委托类型
- 接口类型
创建类型使用类型声明,它包含以下信息:
- 要创建的类型种类
- 新类型的名称
- 类型的每个成员的声明(名称和规范),数组和委托类型除外,它们没有命名成员
声明类型后,就可以像使用预定义类型一样创建和使用该类型的对象。使用预定义类型是一步过程,只需实例化该类型的对象;使用用户定义类型是两步过程,必须先声明类型,然后实例化该类型的对象。
```mermaid
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(使用预定义类型):::process --> B(实例化对象):::process;
C(使用用户定义类型):::process --> D(声明类型):::process;
D --> E(实例化对象):::process;
```
#### 3. 栈和堆
程序运行时,其数据必须存储在内存中。一个数据项所需的内存量以及存储位置和方式取决于其类型。运行中的程序使用两个内存区域来存储数据:栈和堆。
##### 3.1 栈
系统负责所有栈操作,作为程序员无需显式处理栈。但了解栈的基本功能有助于更好地理解程序运行时的行为,以及更深入理解 C# 文档和资料。
栈是一个内存数组,作为后进先出(LIFO)的数据结构,它存储以下几种类型的数据:
- 某些类型变量的值
- 程序的当前执行环境
- 传递给方法的参数
栈的一般特性如下:
- 数据只能从栈顶添加和删除。
- 将数据项放置在栈顶称为将该项压入栈。
- 从栈顶删除数据项称为从栈中弹出该项。
##### 3.2 堆
堆是分配内存块以存储某些类型数据对象的区域。与栈不同,内存可以按任意顺序存储和从堆中移除。程序可以在堆中存储数据项,但不能显式删除它们,而是由 CLR 的垃圾回收器(GC)在确定代码不再访问孤立的堆对象时自动清理,这避免了在其他编程语言中容易出错的任务。
#### 4. 值类型和引用类型
数据项的类型定义了存储它所需的内存量以及组成它的数据成员,同时也决定了对象在内存中的存储位置(栈或堆)。类型分为两类:值类型和引用类型,这两种类型的对象在内存中的存储方式不同。
- 值类型只需要一段内存来存储实际数据。
- 引用类型需要两段内存:
- 第一段包含实际数据,始终位于堆中。
- 第二段是一个引用,指向堆中数据的存储位置。
当数据不是另一个类型的成员时,值类型的数据存储在栈上,引用类型的实际数据存储在堆中,引用存储在栈上。而当数据是另一个类型的成员时,存储方式可能会有所不同。对于引用类型的对象,其所有数据成员(无论值类型还是引用类型)都存储在堆中。
C# 类型的分类如下表所示:
| 值类型 | 引用类型 |
| --- | --- |
| 预定义类型:sbyte、byte、float、short、int
0
0
复制全文