变量与类型
这是什么:变量 = 给数据起的名字,一个贴了名字的盒子,随时存、随时取;每张盒子还贴着一张类型标签。
为什么用:上一章我们让电脑说了句话,但它转头就忘——程序还没学会记住数据。没有变量,程序里只能写死数字,改一个值要翻遍整个文件。
如何用:用 = 号赋值就能创建变量,本章把字符串、整数、浮点数、布尔这四种类型都试一遍。
显式类型:先声明,再用
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 是懒得写标签;插值 $ 开头,花括号里填变量。
动手改
- 声明你的名字和年龄,用插值输出一句自我介绍
- 用
var声明一个小数,再试着给它赋一个字符串,看看报错长什么样 - 猜一猜
(int)7.9等于几?先写下答案,再运行验证 - 用
int.TryParse把用户输入的字符串安全转成整数,失败时提示"请输入数字"
下一章:流程控制,让程序学会看情况办事 🐸