第 2 课 · 约 12 分钟 · ← 第 1 课
变量与核心类型
每个 C# 值都有一个类型,在你写下的那一刻就定了。认识你每天都要用的五个,以及每个新手都会中一次的三记陷阱。
变量是贴了标签的盒子,形状只有一种
声明变量 = 预定一个盒子、贴上标签、决定什么形状能放进去。一旦决定,形状永不改变:
int age = 36; // 只装整数
double height = 1.7; // 小数
string name = "Ada Lovelace"; // 文本,带引号
bool isProgrammer = true; // 只有 true 或 false
Console.WriteLine(age);
Console.WriteLine(name);
Console.WriteLine(isProgrammer);
把 int age = 36; 从右往左读:"造出 36,放进一个叫 age、只装 int 的盒子。"类型是承诺——对编译器,也对未来的每个读者。
以后会常遇到的 char
第五个核心类型装单个字符,用单引号。它和一字节的字符串是不同物种:
char letter = 'a'; // 单引号 = 恰好一个字符
Console.WriteLine(letter);
Console.WriteLine(letter + 0); // 意外:char 就是它的数字(97 = 'a' 的码)
Console.WriteLine((char)(letter + 1)); // ……所以 char 能做运算
var:同样的盒子,让编译器替你贴标签
var 不是"随便什么类型都行"——它意思是"编译器,看看右边,替我把类型填上":
var price = 9.99; // 编译器写成:double price = 9.99;
var count = 42; // 编译器写成:int count = 42;
Console.WriteLine(price);
Console.WriteLine(count);
证明它不是动态类型——去练习场往一个 var 数字里塞文本:编译器拒绝的方式和你写 int 时一模一样。(完整故事:var 与显式类型。)
陷阱一:int 除法扔掉小数
Console.WriteLine(7 / 2); // 两边 int → 整数运算 → 3
Console.WriteLine(7 / 2.0); // 一边 double → double 运算 → 3.5
它有一篇专门的文章:为什么 C# 里 7 / 2 = 3——包括负数规则和三种修法。
陷阱二:int 有天花板——而且会回绕
int biggest = int.MaxValue;
Console.WriteLine(biggest);
Console.WriteLine(biggest + 1); // 回绕成最负的 int!
int 是 32 位:装得下 −2,147,483,648 … 2,147,483,647。过了天花板就回绕(像汽车里程表)。更大的整数,真实代码用 long(64 位)。
陷阱三:double 是近似值
Console.WriteLine(0.1 + 0.2 == 0.3); // False!和是 0.30000000000000004…
Console.WriteLine((0.1 + 0.2).ToString("F2")); // 0.30 —— 显示格式把它藏起来了
double 用二进制存小数,而某些十进制值(0.1!)没有精确的二进制形式——就像 ⅓ 没有精确的十进制形式。显示用 F2 这类格式;永远别用 == 比较 double;钱用 decimal。
打印:把值拼进文本
三种写法,同一结果。插值是现代首选:
string name = "Ada";
int age = 36;
Console.WriteLine(name + " is " + age); // 拼接:+ 粘文本
Console.WriteLine(string.Format("{0} is {1}", name, age)); // 占位符
Console.WriteLine($"{name} is {age}"); // 插值:$ + {…}