什么是变量?
变量 是指程序用来存储和引用数据的存储区的名字 。每个变量都有一个特定的类型,它决定了变量所占内存的大小和布局,以及可以存储的值的范围和可以对其执行的操作。你可以将变量想象成一个带标签的容器,用于存储数据以便在程序中重复使用。
变量的声明与初始化
在C#中,使用变量前必须先"声明"它,也就是告诉编译器变量的类型和名称。
声明语法:
csharp
<data_type> <variable_name>;
例如,声明一个用来存储整数的变量:
csharp
int age;
声明之后,你可以给变量赋值,这个过程称为"初始化"。
csharp
age = 25;
当然,你也可以在声明的同时进行初始化:
csharp
int age = 25;
养成初始化变量的好习惯,可以避免程序出现意想不到的结果。
C#的数据类型:两大阵营
在C#中,数据类型主要分为两大类:值类型(Value Types) 和 引用类型(Reference Types)。
1. 值类型 (Value Types)
值类型的变量直接包含其数据。 当你将一个值类型变量赋给另一个变量时,实际上是创建了该数据的完整副本。 它们通常存储在内存的"栈"上,访问速度快。
常见的内置值类型包括:
- 整型: 用于表示整数。
int: 32位有符号整数,最常用。long: 64位有符号整数,用于表示非常大的整数。short: 16位有符号整数。byte: 8位无符号整数 (0 到 255)。
- 浮点型: 用于表示带有小数的数字。
float: 单精度浮点数。double: 双精度浮点数,精度更高,更常用。decimal: 用于高精度的财务和货币计算。
- 布尔型:
bool: 只能是true或false。
- 字符型:
char: 表示单个Unicode字符。
示例:
csharp
int myInt = 10;
int anotherInt = myInt; // anotherInt 获得了 myInt 的一个副本
anotherInt = 20;
Console.WriteLine(myInt); // 输出 10
Console.WriteLine(anotherInt); // 输出 20
// 可以看到,修改anotherInt并不影响myInt
2. 引用类型 (Reference Types)
与值类型不同,引用类型的变量不直接存储实际数据,而是存储对数据所在内存地址的"引用"。 换句话说,它指向了数据实际存储的位置。 这些数据实际存放在内存的"堆"上。
当把一个引用类型变量赋给另一个变量时,只是复制了引用(地址),两个变量将指向堆中同一个对象。 因此,通过一个变量修改了对象,另一个变量也会受到影响。
内置的引用类型主要有:
- 字符串 (string): 用于表示一系列字符。虽然
string的行为在很多方面看起来像值类型(比如它的不变性),但它本质上是引用类型。 - 对象 (object): 它是C#中所有类型的最终基类。一个
object类型的变量可以引用任何类型的实例。 - 数组 (Array): 用于存储同类型的元素集合。
- 类 (Class)、接口 (Interface)、委托 (Delegate)
示例:
csharp
// 假设我们有一个 Person 类
public class Person
{
public string Name { get; set; }
}
Person person1 = new Person();
person1.Name = "张三";
Person person2 = person1; // person2 复制了 person1 的引用,指向同一个对象
person2.Name = "李四";
Console.WriteLine(person1.Name); // 输出 "李四"
Console.WriteLine(person2.Name); // 输出 "李四"
// 可以看到,修改person2的Name属性,person1的也跟着改变了
值类型与引用类型的核心区别
| 特性 | 值类型 | 引用类型 |
|---|---|---|
| 存储内容 | 直接存储数据值 | 存储数据的引用(内存地址) |
| 内存位置 | 主要在栈 (Stack) 上分配 | 在堆 (Heap) 上分配 |
| 赋值操作 | 复制数据本身 | 复制引用 |
| 基类 | 继承自 System.ValueType |
继承自 System.Object |
| 可为null | 默认不可为null (可空类型除外,如int?) |
可以为 null |
结语
点个赞,关注我获取更多实用 C# 技术干货!如果觉得有用,记得收藏本文!