Skip to Content
Week 01Day 2 - 变量与类型

Day 2 - 变量与类型

建议用时:180-210 分钟

你将学会什么

  • 变量是什么,为什么程序需要变量
  • 声明、赋值、读取分别是什么意思
  • intdecimalstringboolDateTime 分别适合保存什么
  • 为什么用户输入先是字符串,不能直接当数字算
  • TryParse 为什么比 Parse 更适合处理输入
  • null、空字符串、空格字符串有什么区别
  • var 是什么,什么时候可以用,什么时候不建议用
  • 如何写一个“输入商品 -> 转换类型 -> 计算总价 -> 输出结果”的完整程序

本页只讲 C# 基础。不要急着记很多类型,先抓住一句话:变量给数据起名字,类型决定数据能做什么。

本页固定顺序

  1. 先学第一部分:弄懂今天最小、最重要的知识,并运行短例子。
  2. 再学第二部分:把刚学的知识组合成一个完整例子。
  3. 然后做第三部分:自己跟着敲,再完成重复训练和每日小测。
  4. 最后做第四部分:先独立完成作业,再用完整答案检查。

学习衔接

上一页学习的是“环境搭建与 Hello World”,今天继续学习“变量与类型”。先使用上一页已经会的写法,再只增加今天这个新知识点;如果前置内容还不能独立敲出,先回上一页复习,不要硬跳。

今天的最低通过线

第一次学习不要求背完整页。完成下面 3 项,就可以继续:

  • 能用自己的话说明“变量与类型”解决什么问题。
  • 把第一部分的短例子亲手敲完,并确认每个例子都能运行。
  • 不看完整答案完成第三部分至少前 3 个例子,再主动改一个值观察结果。

第一部分:先学原理和最小知识

这一部分先解决“这是什么、为什么要这样写”。每看到一个短例子就亲手敲一遍并运行,不要先背完整程序。

今天先抓住什么

程序处理的不是一堆散乱文字,而是一份份有含义的数据。

例如:

Keyboard 是商品名称 19.9 是单价 3 是数量 59.70 是总价

这些数据要被程序保存、计算和输出,就需要变量和类型。

变量名:负责让你找到这份数据 类型:负责规定这份数据能做什么 值:变量里面真正保存的内容

名词先讲清楚

名词直接解释例子
变量保存一份数据的名字pricecountname
类型规定变量能保存什么intdecimalstring
声明告诉 C# 要创建一个变量int count;
赋值把右边的值放进左边变量count = 3;
读取把变量里的值拿出来用Console.WriteLine(count);
字面量直接写在代码里的值3"Tom"19.9m
表达式能算出一个结果的一段代码price * count
转换把一种类型变成另一种类型"18" 转成 18

变量到底是什么

变量不是注释,也不是给人看的文字说明。变量是程序真正会使用的数据入口。

int age = 18; Console.WriteLine(age + 1);

这段代码输出:

19

原因是:age 里面保存的是数字 18,所以 age + 1 等于 19

声明、赋值、读取要分开看

int count; // 声明:创建一个整数变量 count = 3; // 赋值:把 3 放进去 Console.WriteLine(count); // 读取:把变量里的值拿出来输出

也可以声明和赋值写在一行:

int count = 3;

这两种写法最终效果一样。刚开始写代码时,建议优先写后一种,因为变量一出现就有值,更不容易忘记赋值。

类型为什么重要

类型决定变量能不能参与某些操作。

int count = 3; decimal price = 19.9m; string name = "Keyboard"; Console.WriteLine(count + 1); Console.WriteLine(price * count); Console.WriteLine(name.ToUpper());

这里三种变量能做的事不同:

变量类型可以做什么
countint整数计算、比较大小
pricedecimal金额计算、保留小数
namestring拼接、裁剪、转大小写

如果把 name 当成数字去乘,C# 会直接报错。严格类型不是麻烦,它是在帮你提前发现错误。

常用类型怎么选

业务数据推荐类型原因
数量、年龄、次数int都是整数
很大的整数long范围比 int 更大
金额、单价、总价decimal适合钱,精度更稳定
普通测量值double适合一般小数计算
姓名、编号、备注string文本内容
是否通过、是否启用bool只有 truefalse
单个字符char一个字符,例如 'A'
日期时间DateTime表示时间点

常见类型的常用操作方法

只知道类型名字还不够,还要知道这个类型平时能做什么。

下面这些操作先不要求全部背下来,但要知道“遇到什么问题该找哪个方法”。

string 文本常用操作

string 用来保存文本,例如商品名、姓名、编号、备注。

操作写法作用
判断空白string.IsNullOrWhiteSpace(name)判断 null、空字符串、全空格
去掉前后空格name.Trim()" Tom " 变成 "Tom"
转大写name.ToUpper()"abc" 变成 "ABC"
转小写name.ToLower()"ABC" 变成 "abc"
是否包含name.Contains("key")判断文本里有没有某段文字
是否以某段开头name.StartsWith("A")判断开头
是否以某段结尾name.EndsWith(".txt")判断结尾
替换文字name.Replace(" ", "-")把空格替换成横线
取长度name.Length得到字符数量
分割文本text.Split(',')按逗号切成数组
拼接数组string.Join(", ", items)把多段文字合成一段

完整例子:

string rawName = " keyboard pro "; string cleanName = rawName.Trim(); Console.WriteLine(cleanName); Console.WriteLine(cleanName.ToUpper()); Console.WriteLine(cleanName.Contains("key")); Console.WriteLine(cleanName.Length); Console.WriteLine(cleanName.Replace(" ", "-"));

输出:

keyboard pro KEYBOARD PRO True 12 keyboard-pro

int 整数常用操作

int 用来保存整数,例如数量、年龄、次数、页码。

操作写法作用
加法a + b两个整数相加
减法a - b两个整数相减
乘法a * b两个整数相乘
整数除法a / b两个整数相除,只保留整数部分
取余数a % b得到除法余数
比较大小a > ba <= b得到 truefalse
转字符串count.ToString()把整数变成文本
取较大值Math.Max(a, b)返回较大的数
取较小值Math.Min(a, b)返回较小的数

完整例子:

int stock = 23; int pageSize = 5; Console.WriteLine(stock / pageSize); Console.WriteLine(stock % pageSize); Console.WriteLine(Math.Max(stock, 30)); Console.WriteLine(stock > 0);

输出:

4 3 30 True

这里 23 / 5 输出 4,不是 4.6,因为两个 int 相除还是整数除法。

decimal 金额常用操作

decimal 常用于金额、单价、总价。

操作写法作用
金额字面量19.9mm 表示这是 decimal
加减乘除price * count计算金额
保留两位显示price.ToString("F2")输出成 19.90
四舍五入Math.Round(price, 2)保留指定小数位
比较大小price > 0校验金额是否有效

完整例子:

decimal price = 19.9m; int count = 3; decimal total = price * count; decimal discount = 0.8m; decimal finalTotal = total * discount; Console.WriteLine(total.ToString("F2")); Console.WriteLine(Math.Round(finalTotal, 2)); Console.WriteLine(finalTotal > 0);

输出:

59.70 47.76 True

bool 真假值常用操作

bool 只有两个值:truefalse

常用于判断、开关、权限、状态。

操作写法作用
取反!isEnabledtruefalsefalsetrue
并且a && b两个条件都成立才是 true
或者a || b任意一个条件成立就是 true
等于a == b判断两个值是否相等
不等于a != b判断两个值是否不相等

完整例子:

decimal price = 19.9m; int stock = 3; bool priceOk = price > 0; bool stockOk = stock > 0; bool canSell = priceOk && stockOk; Console.WriteLine(priceOk); Console.WriteLine(stockOk); Console.WriteLine(canSell); Console.WriteLine(!canSell);

输出:

True True True False

DateTime 日期时间常用操作

DateTime 用来保存一个时间点,例如创建时间、下单时间、过期时间。

操作写法作用
当前时间DateTime.Now当前日期和时间
今天日期DateTime.Today今天 00:00:00
加一天date.AddDays(1)得到后一天
加一个月date.AddMonths(1)得到后一个月
date.Year取年份
date.Month取月份
date.Day取日期
格式化date.ToString("yyyy-MM-dd")输出指定格式
尝试转换DateTime.TryParse(text, out DateTime date)把文本转成日期

完整例子:

DateTime now = DateTime.Now; DateTime tomorrow = now.AddDays(1); Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm")); Console.WriteLine(tomorrow.ToString("yyyy-MM-dd")); Console.WriteLine(now.Year);

输出示例:

2026-06-13 10:30 2026-06-14 2026

你的时间会和示例不同,因为 DateTime.Now 读取的是当前电脑时间。

数字字面量为什么有后缀

直接写在代码里的值叫字面量。

int count = 3; long bigCount = 3000000000L; double temperature = 36.5; decimal price = 19.9m;

需要注意两个后缀:

写法意思
3000000000LL 表示这是 long
19.9mm 表示这是 decimal

金额用 decimal 时,字面量后面要写 m。否则 19.9 默认更接近 double,不能直接放进 decimal 变量。

输入为什么先是字符串

键盘输入进来的内容,程序一开始只能拿到文本。

用户输入:

18

程序拿到的是:

string? input = "18";

它看起来像数字,但类型还是 string。字符串的 "18" 和数字的 18 不是同一种东西。

Console.WriteLine("18" + "1"); // 181 Console.WriteLine(18 + 1); // 19

第一行是字符串拼接,第二行是数字相加。

TryParse 为什么常用

用户输入不一定正确。可能输入 abc、空内容、多个空格,也可能输入 19.9 当数量。

TryParse 的作用是:尝试转换,成功就得到数字,失败就返回 false,程序不会直接崩掉。

string? input = Console.ReadLine(); if (!int.TryParse(input, out int age)) { Console.WriteLine("年龄必须是整数"); return; } Console.WriteLine($"明年年龄: {age + 1}");

这段代码里:

部分意思
int.TryParse尝试转成整数
input原始输入文本
out int age转换成功后,把结果放到 age
!表示“不是”,也就是转换失败
return提前结束程序

常见转换方法:

目标类型写法适合什么输入
intint.TryParse(text, out int value)数量、年龄、次数
decimaldecimal.TryParse(text, out decimal value)金额、价格
doubledouble.TryParse(text, out double value)一般测量值
boolbool.TryParse(text, out bool value)truefalse
DateTimeDateTime.TryParse(text, out DateTime value)日期时间文本

完整转换例子:

string priceText = "19.9"; string countText = "3"; string dateText = "2026-06-13"; bool priceOk = decimal.TryParse(priceText, out decimal price); bool countOk = int.TryParse(countText, out int count); bool dateOk = DateTime.TryParse(dateText, out DateTime createdAt); Console.WriteLine(priceOk); Console.WriteLine(countOk); Console.WriteLine(dateOk); Console.WriteLine(price * count); Console.WriteLine(createdAt.ToString("yyyy-MM-dd"));

输出:

True True True 59.7 2026-06-13

null、空字符串、空格字符串

用户输入文本时,可能遇到三种情况:

情况例子说明
null没有读到内容变量没有有效字符串
空字符串""用户直接回车
空格字符串" "用户只输入空格

这三种情况都不适合作为商品名称,所以可以统一判断:

Console.Write("商品名称: "); string? name = Console.ReadLine(); if (string.IsNullOrWhiteSpace(name)) { Console.WriteLine("商品名称不能为空"); return; } Console.WriteLine($"商品名称: {name.Trim()}");

var 是什么

var 不是没有类型,也不是可以随便变。

var count = 3; // 编译器推断为 int var price = 19.9m; // 编译器推断为 decimal var name = "Tom"; // 编译器推断为 string

右边的值决定了真实类型。下面这样不行:

var count = 3; // count = "Tom"; // 错,count 已经是 int

刚开始写 C# 时,基础类型建议先显式写出来:

int count = 3; decimal price = 19.9m; string name = "Tom";

这样更容易看清类型。

今天写代码时按这个顺序

  1. 先确定这份数据表示什么业务含义。
  2. 再选择类型:整数、金额、文本、真假。
  3. 用户输入先用 string? 接收。
  4. 文本要先判断空值。
  5. 需要计算时,再用 TryParse 转成数字。
  6. 计算结果用新变量保存。
  7. 输出金额时用 {total:F2} 保留两位小数。

第二部分:把知识组合成完整例子

前面已经学过最小知识。现在把它们组合起来,先读懂执行顺序,再完整敲一遍。先知道今天能写出什么,再去下面拆每一行。

最终你要写出这个程序

Console.Write("商品名称: "); string? name = Console.ReadLine(); Console.Write("单价: "); string? priceText = Console.ReadLine(); Console.Write("数量: "); string? countText = Console.ReadLine(); if (string.IsNullOrWhiteSpace(name)) { Console.WriteLine("商品名称不能为空"); return; } if (!decimal.TryParse(priceText, out decimal price)) { Console.WriteLine("单价必须是数字"); return; } if (!int.TryParse(countText, out int count)) { Console.WriteLine("数量必须是整数"); return; } decimal total = price * count; Console.WriteLine($"{name.Trim()} x {count} = {total:F2}");

正常输入时:

商品名称: Keyboard 单价: 19.9 数量: 3 Keyboard x 3 = 59.70

错误输入时:

商品名称: Keyboard 单价: abc 单价必须是数字

这个例子里同时出现了文本、金额、整数、真假判断和格式化输出。今天的重点就是把这些数据分清楚。

第三部分:跟着敲代码

从这里开始动手。每个例子都可以直接放进 Program.cs 运行。

动手前先做这 3 件事

  1. 打开昨天创建的控制台项目,确认 dotnet run 能运行。
  2. 每做一个例子,就把 Program.cs 旧内容替换掉。
  3. 每次只改一个数字或一行输入,观察结果怎么变。

例子 1:变量的声明、赋值、读取

int count = 3; decimal price = 19.9m; string name = "Keyboard"; Console.WriteLine(name); Console.WriteLine(count); Console.WriteLine(price);

预期输出:

Keyboard 3 19.9

count 改成 5,再运行一次,观察第二行输出变化。

例子 2:数字变量参与计算

decimal price = 19.9m; int count = 3; decimal total = price * count; Console.WriteLine($"单价: {price:F2}"); Console.WriteLine($"数量: {count}"); Console.WriteLine($"总价: {total:F2}");

预期输出:

单价: 19.90 数量: 3 总价: 59.70

F2 表示输出两位小数。金额输出时很常用。

例子 3:字符串不能直接当数字算

string a = "10"; string b = "2"; Console.WriteLine(a + b); int x = 10; int y = 2; Console.WriteLine(x + y);

预期输出:

102 12

这个例子要记住:看起来像数字的字符串,仍然是字符串。

例子 4:把输入转成整数

Console.Write("年龄: "); string? input = Console.ReadLine(); if (!int.TryParse(input, out int age)) { Console.WriteLine("年龄必须是整数"); return; } Console.WriteLine($"明年年龄: {age + 1}");

输入 18 时:

年龄: 18 明年年龄: 19

输入 abc 时:

年龄: abc 年龄必须是整数

例子 5:判断文本是不是空

Console.Write("姓名: "); string? name = Console.ReadLine(); if (string.IsNullOrWhiteSpace(name)) { Console.WriteLine("姓名不能为空"); return; } string cleanName = name.Trim(); Console.WriteLine($"你好,{cleanName}");

这个例子里,Trim() 会去掉前后空格。

例子 6:字符串常用操作

string productName = " Keyboard Pro "; string cleanName = productName.Trim(); Console.WriteLine($"原始长度: {productName.Length}"); Console.WriteLine($"整理后: {cleanName}"); Console.WriteLine($"整理后长度: {cleanName.Length}"); Console.WriteLine($"大写: {cleanName.ToUpper()}"); Console.WriteLine($"是否包含 key: {cleanName.ToLower().Contains("key")}"); Console.WriteLine($"替换空格: {cleanName.Replace(" ", "-")}");

预期输出:

原始长度: 16 整理后: Keyboard Pro 整理后长度: 12 大写: KEYBOARD PRO 是否包含 key: True 替换空格: Keyboard-Pro

例子 7:整数、金额和真假判断

decimal price = 19.9m; int count = 3; int stock = 10; decimal total = price * count; bool hasEnoughStock = stock >= count; bool priceOk = price > 0; bool canBuy = hasEnoughStock && priceOk; Console.WriteLine($"总价: {total:F2}"); Console.WriteLine($"库存够不够: {hasEnoughStock}"); Console.WriteLine($"价格是否有效: {priceOk}"); Console.WriteLine($"能不能购买: {canBuy}");

预期输出:

总价: 59.70 库存够不够: True 价格是否有效: True 能不能购买: True

例子 8:日期时间常用操作

DateTime createdAt = DateTime.Now; DateTime expiredAt = createdAt.AddDays(7); Console.WriteLine($"创建时间: {createdAt:yyyy-MM-dd HH:mm}"); Console.WriteLine($"过期时间: {expiredAt:yyyy-MM-dd}"); Console.WriteLine($"年份: {createdAt.Year}"); Console.WriteLine($"月份: {createdAt.Month}"); Console.WriteLine($"日期: {createdAt.Day}");

输出里的日期会根据当前电脑时间变化,重点看格式。

例子 9:完整输入、转换、计算、输出

Console.Write("商品名称: "); string? name = Console.ReadLine(); Console.Write("单价: "); string? priceText = Console.ReadLine(); Console.Write("数量: "); string? countText = Console.ReadLine(); if (string.IsNullOrWhiteSpace(name)) { Console.WriteLine("商品名称不能为空"); return; } if (!decimal.TryParse(priceText, out decimal price)) { Console.WriteLine("单价必须是数字"); return; } if (!int.TryParse(countText, out int count)) { Console.WriteLine("数量必须是整数"); return; } decimal total = price * count; Console.WriteLine($"{name.Trim()} x {count} = {total:F2}");

输入 Keyboard19.93,应该输出:

Keyboard x 3 = 59.70

常见错误和修法

错误为什么错修法
把用户输入直接当数字算ReadLine() 读到的是 string?先用 TryParse 转成 intdecimal
金额写成 double金额计算容易出现精度问题金额优先用 decimal,字面量加 m
没有处理空名称空格也会被当成商品名string.IsNullOrWhiteSpace 判断
忘记 Trim()前后空格会影响保存和搜索保存前先 name.Trim()
var 用得太早看不清变量真实类型基础阶段关键变量先写明确类型

每日小测

做完本页后,用这 5 题检查是否真的掌握。

1. 判断题

本页的目标不是只把代码运行起来,还要能说清楚“为什么这样写”。

答案:对。能运行只是第一步,能解释原理、常用操作和常见错误,才说明本页内容进入了可复用能力。

2. 填空题

本页主题是:变量与类型。今天至少要掌握的 3 个点是:

1. 变量是什么,为什么程序需要变量 2. 声明、赋值、读取分别是什么意思 3. `int`、`decimal`、`string`、`bool`、`DateTime` 分别适合保存什么

答案:以上 3 点必须能用自己的代码跑通,不能只停留在阅读。

3. 流程题

遇到本页相关功能时,先按什么顺序处理?

答案:先看完整例子,确认最终效果;再读原理和名词;然后跟着第三部分从空项目敲代码;最后对照作业答案检查。

4. 找错误题

如果本页代码运行失败,第一步应该做什么?

答案:先看终端或 IDE 里的第一条错误,找到文件名和行号;不要同时改很多地方。再回到本页的“常见错误和修法”表格,对照错误类型逐项排查。

5. 改需求题

在本页完整例子跑通后,至少改一个小需求。

可选改法:

  • 改一个字段名称。
  • 多加一个校验条件。
  • 多输出一行结果。
  • 把固定数据改成用户输入。
  • 把一次处理改成多条数据处理。

答案标准:修改后能重新运行,并能说明这次修改影响了哪一段逻辑。重点检查:变量是什么,为什么程序需要变量。

上位机专项练习

设备名称、温度、压力、是否在线、采集时间都需要不同类型。今天用上位机数据把变量和类型分清楚。

下面 3 个例子都要亲手敲。先运行原代码,再完成每个例子后面的改动任务。

专项例子 1:保存一台设备的基础状态

string deviceName = "温度传感器-01"; double temperature = 26.5; bool isOnline = true; Console.WriteLine(deviceName); Console.WriteLine(temperature); Console.WriteLine(isOnline);

运行结果或界面效果:

温度传感器-01 26.5 True

改动任务: 把温度改成 80.2,把在线状态改成 false。

专项例子 2:把输入转换成采集周期

Console.Write("采集周期(毫秒): "); string? input = Console.ReadLine(); if (int.TryParse(input, out int interval)) { Console.WriteLine($"每 {interval} 毫秒采集一次"); } else { Console.WriteLine("采集周期必须是整数"); }

运行结果或界面效果:

采集周期(毫秒): 1000 每 1000 毫秒采集一次

改动任务: 输入 abc,确认程序走到错误提示。

专项例子 3:记录一次采集时间

DateTime collectedAt = DateTime.Now; decimal pressure = 1.25m; Console.WriteLine($"压力: {pressure:F2} MPa"); Console.WriteLine($"采集时间: {collectedAt:yyyy-MM-dd HH:mm:ss}");

运行结果或界面效果:

压力: 1.25 MPa 采集时间: 当前日期和时间

改动任务: 把单位从 MPa 改成 bar,只改显示文字。

第四部分:作业完整答案

这一部分给出当天作业的完整答案。先按第三部分做一遍,再用这里检查。

作业要求

写一个商品小票程序,要求:

  1. 输入商品名称。
  2. 输入单价。
  3. 输入数量。
  4. 商品名称不能为空。
  5. 单价必须是数字。
  6. 数量必须是整数。
  7. 输出商品名称、单价、数量、总价。

作业拆解

按这个顺序写,不要跳步:

  1. 先用 Console.ReadLine() 接收三个输入。
  2. string.IsNullOrWhiteSpace 判断商品名称。
  3. decimal.TryParse 转换单价。
  4. int.TryParse 转换数量。
  5. price * count 算总价。
  6. 用字符串插值输出结果。

完整代码

Console.Write("商品名称: "); string? name = Console.ReadLine(); Console.Write("单价: "); string? priceText = Console.ReadLine(); Console.Write("数量: "); string? countText = Console.ReadLine(); if (string.IsNullOrWhiteSpace(name)) { Console.WriteLine("商品名称不能为空"); return; } if (!decimal.TryParse(priceText, out decimal price)) { Console.WriteLine("单价必须是数字"); return; } if (!int.TryParse(countText, out int count)) { Console.WriteLine("数量必须是整数"); return; } if (price < 0) { Console.WriteLine("单价不能小于 0"); return; } if (count <= 0) { Console.WriteLine("数量必须大于 0"); return; } string cleanName = name.Trim(); decimal total = price * count; Console.WriteLine("----- 小票 -----"); Console.WriteLine($"商品: {cleanName}"); Console.WriteLine($"单价: {price:F2}"); Console.WriteLine($"数量: {count}"); Console.WriteLine($"总价: {total:F2}");

正确运行结果

正常输入:

商品名称: Keyboard 单价: 19.9 数量: 3 ----- 小票 ----- 商品: Keyboard 单价: 19.90 数量: 3 总价: 59.70

单价错误:

商品名称: Keyboard 单价: abc 数量: 3 单价必须是数字

数量错误:

商品名称: Keyboard 单价: 19.9 数量: 2.5 数量必须是整数

你要能说清楚这 6 件事

  • string? name 保存用户输入的商品名称。
  • decimal price 保存单价,因为金额适合用 decimal
  • int count 保存数量,因为数量应该是整数。
  • TryParse 用来安全转换输入。
  • return 用来在错误输入时提前结束程序。
  • {total:F2} 用来把金额输出成两位小数。

加强作业:商品小票加常用方法

这道题专门练常见类型的常用操作。

要求:

  1. 输入商品名称。
  2. 输入单价。
  3. 输入购买数量。
  4. 输入库存数量。
  5. 商品名称要去掉前后空格。
  6. 商品名称统一显示成大写。
  7. 单价和总价保留两位小数。
  8. 判断库存是否足够。
  9. 输出当前打印小票的日期。

完整答案:

Console.Write("商品名称: "); string? nameText = Console.ReadLine(); Console.Write("单价: "); string? priceText = Console.ReadLine(); Console.Write("购买数量: "); string? countText = Console.ReadLine(); Console.Write("库存数量: "); string? stockText = Console.ReadLine(); if (string.IsNullOrWhiteSpace(nameText)) { Console.WriteLine("商品名称不能为空"); return; } if (!decimal.TryParse(priceText, out decimal price)) { Console.WriteLine("单价必须是数字"); return; } if (!int.TryParse(countText, out int count)) { Console.WriteLine("购买数量必须是整数"); return; } if (!int.TryParse(stockText, out int stock)) { Console.WriteLine("库存数量必须是整数"); return; } if (price <= 0) { Console.WriteLine("单价必须大于 0"); return; } if (count <= 0) { Console.WriteLine("购买数量必须大于 0"); return; } if (stock < 0) { Console.WriteLine("库存数量不能小于 0"); return; } string cleanName = nameText.Trim(); string displayName = cleanName.ToUpper(); decimal total = price * count; bool hasEnoughStock = stock >= count; DateTime printedAt = DateTime.Now; Console.WriteLine(); Console.WriteLine("----- 商品小票 -----"); Console.WriteLine($"打印日期: {printedAt:yyyy-MM-dd HH:mm}"); Console.WriteLine($"商品: {displayName}"); Console.WriteLine($"单价: {price:F2}"); Console.WriteLine($"购买数量: {count}"); Console.WriteLine($"库存数量: {stock}"); Console.WriteLine($"库存是否足够: {hasEnoughStock}"); Console.WriteLine($"总价: {total:F2}");

正常输入:

商品名称: keyboard pro 单价: 199.9 购买数量: 2 库存数量: 10 ----- 商品小票 ----- 打印日期: 2026-06-13 10:30 商品: KEYBOARD PRO 单价: 199.90 购买数量: 2 库存数量: 10 库存是否足够: True 总价: 399.80

这里用到了这些常见方法和操作:

代码作用
string.IsNullOrWhiteSpace(nameText)判断名称是不是空
nameText.Trim()去掉前后空格
cleanName.ToUpper()转成大写显示
decimal.TryParse(...)把单价文本转成金额
int.TryParse(...)把数量文本转成整数
stock >= count判断库存是否足够
{price:F2}金额保留两位小数
DateTime.Now获取当前时间
{printedAt:yyyy-MM-dd HH:mm}按指定格式输出日期时间