从零开始掌握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: 只能是 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# 技术干货!如果觉得有用,记得收藏本文!

相关推荐
TheITSea4 小时前
JavaScript Web APIs
开发语言·前端·javascript
恋猫de小郭4 小时前
Android CLI 支持 AI Agent 通过 Device Streaming 调试云真机
android·前端·flutter
Wang's Blog4 小时前
Java 项目实战: 外卖平台优化-前端dist部署与Nginx反向代理rewrite
java·前端·nginx
鬓戈4 小时前
Claude Code frontend-design 插件调研 与 Vue 旧系统风格一致性方案
前端·vue.js·人工智能
开开心心就好4 小时前
以图搜图找重复图片,本地工具离线就能用
javascript·智能手机·ffmpeg·c#·ocr·word·音视频
IT_陈寒4 小时前
SpringBoot自动配置的坑我帮你踩过了
前端·人工智能·后端
其实防守也摸鱼5 小时前
网安自测题:掌握核心知识点的实用练习
linux·运维·服务器·前端·数据库·sql·xss
QQ_21696290965 小时前
基于C#(Asp.net)电竞陪玩信息管理系统的设计与实现
java·大数据·spring boot·微信小程序·c#·云计算·asp.net
geovindu7 小时前
css: Timeline scribble
前端·css·iphone
未来之窗软件服务14 小时前
C# 截图源码支持自动保存-东方仙盟
c#·仙盟创梦ide·东方仙盟·电脑工具