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

相关推荐
Sapphire~2 分钟前
【前端基础】04-XSS(跨站脚本攻击,Cross-Site Scripting)
前端·xss
奔跑的web.3 分钟前
Vue 3.6 重磅新特性:Vapor Mode 深度解析
前端·javascript·vue.js
MediaTea4 分钟前
Python OOP 设计思想 13:封装服务于演化
linux·服务器·前端·数据库·python
爱敲代码的婷婷婷.5 分钟前
patch-package 修改 node_modules流程以及注意点
前端·react native·前端框架·node.js
这是个栗子9 分钟前
【API封装参数传递】params 与 API 封装
开发语言·前端·javascript·data·params
凌栀茗17 分钟前
html第二天
前端·javascript·html
你脸上有BUG18 分钟前
CSS实现透明内层+渐变边框的优雅方案
前端·css·毛玻璃
Amumu1213826 分钟前
Redux介绍(一)
前端·javascript·react.js
麷飞花29 分钟前
TypeScript问题
前端·javascript·vscode·typescript·ts
阿湯哥31 分钟前
ReAct智能体
前端·react.js·前端框架