从零开始掌握C#核心:变量与数据类型

什么是变量?

变量 是指程序用来存储和引用数据的存储区的名字 。每个变量都有一个特定的类型,它决定了变量所占内存的大小和布局,以及可以存储的值的范围和可以对其执行的操作。你可以将变量想象成一个带标签的容器,用于存储数据以便在程序中重复使用。

变量的声明与初始化

在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: 只能是 truefalse
  • 字符型:
    • 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# 技术干货!如果觉得有用,记得收藏本文!

相关推荐
崔庆才丨静觅8 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60618 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了9 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅9 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅9 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
懒人咖9 小时前
缺料分析时携带用料清单的二开字段
c#·金蝶云星空
崔庆才丨静觅9 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment9 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅10 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊10 小时前
jwt介绍
前端