🐸 青蛙编程网
首页 / C# / C# 基础 / 3. 变量与类型

变量与类型

这是什么:变量 = 给数据起的名字,一个贴了名字的盒子,随时存、随时取;每张盒子还贴着一张类型标签。

为什么用:上一章我们让电脑说了句话,但它转头就忘——程序还没学会记住数据。没有变量,程序里只能写死数字,改一个值要翻遍整个文件。

如何用:用 = 号赋值就能创建变量,本章把字符串、整数、浮点数、布尔这四种类型都试一遍。

显式类型:先声明,再用

C# 是强类型语言:每个变量都要说清楚自己装什么类型的值。

int age = 18;              // 整数
double price = 9.9;        // 小数
bool isFrog = true;        // 布尔:true / false
string name = "小青蛙";     // 字符串

Console.WriteLine($"我叫 {name},今年 {age} 岁");
我叫 小青蛙,今年 18 岁
类型 装什么 例子
int 整数 42、-7
double 小数 3.14、9.9
bool 真假 true、false
string 文本 "小青蛙"(必须双引号)

还有几个常客先混个脸熟:long 装超大整数,char 装单个字符(单引号 'A'),decimal 装高精度小数(算钱用它)。

var:让编译器替你写类型

类型一眼能看出来时,可以用 var 偷个懒——类型还是固定的,只是让编译器自己推断:

var score = 95;      // 编译器推断为 int,之后只能装整数
// score = "优秀";   // ❌ 报错!var 不是"随便装"

var 不是没有类型,是"懒得写类型"。

常量:不许改的变量

和 var 相反的极端是 const:一出生就定死,改它直接报错——适合装 π、最大重试次数这种"天条":

const int MaxTry = 3;
// MaxTry = 5;   // ❌ 报错,常量不许改

字符串插值:$""

$ 开头的字符串里,{} 会换成变量的值,比一堆 + 拼接清爽得多:

string name = "小青蛙";
int age = 18;
Console.WriteLine($"你好,{name}!明年 {age + 1} 岁");
你好,小青蛙!明年 19 岁

{} 里还能直接做运算,甚至控制格式:{3.14159:F2} 会输出 3.14。拼接一多就乱,插值一眼看清哪里是变量——这也是 C# 最受欢迎的语法之一。

类型转换

不同类型之间经常要"换盒子":

string input = "123";
int number = int.Parse(input);    // 字符串 → 整数
double d = 9.8;
int cut = (int)d;                 // double → int:砍掉小数,得 9
string text = number.ToString();  // 整数 → 字符串
写法 方向 注意
int.Parse(s) 文本 → 数字 文本不是数字就直接报错
(int)d 小数 → 整数 不是四舍五入,是砍掉小数
.ToString() 任何 → 文本 永远不会失败

安全转换:TryParse

int.Parse 遇到非数字会直接崩,生产代码更推荐 int.TryParse:

string input = "abc";
if (int.TryParse(input, out int number))
{
    Console.WriteLine($"解析成功:{number}");
}
else
{
    Console.WriteLine("不是合法数字");
}

TryParse 返回 bool 表示是否成功,成功时用 out 把结果带出来,失败也不报错。

❓ 常见问题

Q1:var 和 dynamic 有什么区别?

var 是编译期推断,类型确定后不能变,性能好、有补全;dynamic 是运行期绑定,类型灵活但没有编译期检查。入门阶段只用 var,dynamic 极少用到。

Q2:const 和 readonly 区别?

const 是编译期常量,值在编译时就必须确定;readonly 是运行期常量,可在构造函数里赋值,之后不可改。入门用 const 足够了。

Q3:(int)7.9 等于几?

等于 7。C# 对浮点数转整数是截断小数(向零取整),不是四舍五入。

⚠️ 新手翻车现场

翻车一:var 以为能随便改类型

var x = 10;
x = "hello";  // ❌ 编译报错:无法将 string 隐式转换为 int

问题:var 只是省去写类型,类型一旦推断(这里是 int)就不能变。

修正:想装不同类型,就别用 var,明确声明或用 object(不推荐入门用)。

翻车二:int.Parse 输入非数字直接崩

string s = "abc";
int n = int.Parse(s);  // ❌ 运行时报 FormatException

问题:Parse 遇到非数字字符串直接抛异常,程序崩溃。

修正:用 int.TryParse(s, out int n),失败也不崩,靠返回值判断。

翻车三:(int)d 期待四舍五入

double d = 7.9;
int n = (int)d;  // 得到 7,不是 8

问题:强制转换是截断小数部分,不是四舍五入。

修正:想四舍五入用 Math.Round(d),再转 int:(int)Math.Round(7.9) 得 8。

🎯 什么时候用哪种声明

场景 推荐 原因
类型一目了然 var 代码简洁,编译器帮推断
类型不明确或想显式说明 int age = 18 可读性更好,新手优先
值不该被改 const 编译期保护,防止误改
需要安全转换 int.TryParse 输入不合法也不崩溃

📝 本章小结

  • C# 是强类型语言,变量要先声明类型
  • int/double/bool/string 是四大常用类型
  • var 让编译器推断类型,类型确定后不可变
  • const 定义不得更改的常量
  • $"" 字符串插值,{} 里能直接放变量和运算
  • 类型转换:int.Parse(可能崩)、int.TryParse(安全)、(int)d(截断小数)
  • 记忆口诀:类型是标签,var 是懒得写标签;插值 $ 开头,花括号里填变量。

动手改

  1. 声明你的名字和年龄,用插值输出一句自我介绍
  2. 用 var 声明一个小数,再试着给它赋一个字符串,看看报错长什么样
  3. 猜一猜 (int)7.9 等于几?先写下答案,再运行验证
  4. 用 int.TryParse 把用户输入的字符串安全转成整数,失败时提示"请输入数字"

下一章:流程控制,让程序学会看情况办事 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。