Day 1 - 环境搭建与 Hello World
建议用时:150-180 分钟
你将学会什么
- 终端、命令、文件夹、项目分别是什么
.NET SDK、dotnet、.csproj、Program.cs分别负责什么- C# 程序从代码到运行结果,中间发生了什么
- 如何创建第一个控制台项目并运行
- 如何修改
Program.cs,再重新运行看到变化 Console.Write、Console.WriteLine、Console.ReadLine的区别- 看到常见报错时,先从哪里排查
本页只讲 C# 控制台基础,不讲任何界面框架。今天的目标不是背命令,而是把“写代码 -> 保存 -> 运行 -> 看结果”这条链路跑通。
本页固定顺序
- 先学第一部分:弄懂今天最小、最重要的知识,并运行短例子。
- 再学第二部分:把刚学的知识组合成一个完整例子。
- 然后做第三部分:自己跟着敲,再完成重复训练和每日小测。
- 最后做第四部分:先独立完成作业,再用完整答案检查。
学习衔接
这是整套课程的起点。今天只建立“能创建项目、能运行、能修改、能再次运行”的最小闭环,不提前学习后面的语法。
今天的最低通过线
第一次学习不要求背完整页。完成下面 3 项,就可以继续:
- 能用自己的话说明“环境搭建与 Hello World”解决什么问题。
- 把第一部分的短例子亲手敲完,并确认每个例子都能运行。
- 不看完整答案完成第三部分至少前 3 个例子,再主动改一个值观察结果。
第一部分:先学原理和最小知识
这一部分先解决“这是什么、为什么要这样写”。每看到一个短例子就亲手敲一遍并运行,不要先背完整程序。
今天先抓住什么
C# 程序不是直接凭空运行的。它需要项目文件告诉 .NET 怎么编译,需要入口文件写程序从哪里开始,需要终端命令启动编译和运行。
今天的主线是:
进入文件夹
-> 创建 C# 项目
-> 得到 .csproj 和 Program.cs
-> 修改 Program.cs
-> 保存文件
-> dotnet run 编译并运行
-> 在终端看到输出名词先讲清楚
| 名词 | 直接解释 | 今天怎么看 |
|---|---|---|
| 终端 | 给电脑输入命令的窗口 | 输入 dotnet run 的地方 |
| 命令 | 让电脑执行某个动作的一行文字 | pwd、ls、cd、dotnet run |
| 文件夹 | 存放文件的位置 | 项目会放在一个文件夹里 |
| 项目 | 一组能一起编译运行的文件 | HelloCSharp 文件夹 |
| SDK | 开发工具包,包含编译器和命令 | 电脑能执行 dotnet --version |
.csproj | C# 项目文件 | 告诉 .NET 这个项目怎么编译 |
Program.cs | 默认入口代码文件 | 今天主要修改它 |
| 编译 | 把 C# 代码检查并变成可运行程序 | dotnet run 会先编译 |
| 运行 | 启动编译后的程序 | 终端出现输出结果 |
终端到底是什么
终端不是写 C# 的地方,它是给电脑下命令的地方。
你在终端输入:
dotnet run意思是:让 .NET 工具在当前文件夹里寻找项目文件,然后编译并启动这个项目。
如果终端站错文件夹,代码写得再对也可能运行不了。所以第一天要先学会看“我现在在哪个文件夹”。
文件夹和项目是什么关系
执行:
dotnet new console -n HelloCSharp会创建一个叫 HelloCSharp 的文件夹,里面有一个 C# 控制台项目。
常见结构是:
HelloCSharp
├── HelloCSharp.csproj
└── Program.cs这两个文件的分工很清楚:
| 文件 | 负责什么 |
|---|---|
HelloCSharp.csproj | 描述项目使用什么 .NET 版本、怎么编译 |
Program.cs | 写真正要执行的 C# 代码 |
平时写练习,主要改 Program.cs。不要随便删 .csproj,项目靠它识别自己。
dotnet run 到底做了什么
dotnet run 不是只做“运行”一件事。它大致会做三步:
检查项目文件 -> 编译 C# 代码 -> 启动程序所以报错也大致分三类:
| 报错位置 | 可能原因 |
|---|---|
| 找不到项目 | 当前文件夹没有 .csproj |
| 编译失败 | C# 代码写错了,例如少了引号或括号 |
| 运行结果不对 | 代码能运行,但逻辑不是你想要的 |
看到报错时,不要整页乱改。先看终端里第一条错误,通常会告诉你文件名和行号。
Console 是什么
Console 表示控制台。控制台程序通过它和终端互动。
| 写法 | 作用 |
|---|---|
Console.WriteLine("文字") | 输出文字,并换到下一行 |
Console.Write("文字") | 输出文字,不换行 |
Console.ReadLine() | 等用户输入一行文字 |
看下面这个例子:
Console.Write("姓名: ");
string? name = Console.ReadLine();
Console.WriteLine($"你好,{name}");第一行不换行,所以用户会在 姓名: 后面输入。第二行读取输入。第三行把输入拼到输出文字里。
今天必须会用的终端命令
第一天最容易卡住的地方不是 C# 语法,而是终端站错目录、项目没创建好、文件没保存。
先把这些命令当成“每天都会用的工具”:
| 命令 | 作用 | 什么时候用 |
|---|---|---|
pwd | 查看当前所在文件夹 | 不确定终端在哪里时 |
ls | 查看当前文件夹里有哪些文件 | 检查有没有 .csproj 和 Program.cs |
cd 文件夹名 | 进入某个文件夹 | 进入项目目录 |
cd .. | 回到上一级文件夹 | 进错目录时返回 |
mkdir 文件夹名 | 创建文件夹 | 创建练习目录 |
clear | 清空终端显示 | 输出太多时整理屏幕 |
dotnet --version | 查看 .NET SDK 版本 | 检查环境是否可用 |
dotnet new console -n 项目名 | 创建控制台项目 | 开始一个新练习 |
dotnet run | 编译并运行当前项目 | 每次改完代码后 |
dotnet build | 只编译,不运行 | 只想检查语法错误时 |
dotnet clean | 清理编译产生的文件 | 编译结果异常时再用 |
注意:dotnet run 必须在有 .csproj 的项目目录里执行。
如果你看到这个错误:
Couldn't find a project to run先执行:
pwd
ls确认当前位置是不是项目文件夹,当前文件夹里有没有 .csproj。
Console 常用方法速查
第一天只需要掌握 Console 的几个常用方法。
| 方法 | 作用 | 例子 |
|---|---|---|
Console.WriteLine(...) | 输出后换行 | Console.WriteLine("保存成功"); |
Console.Write(...) | 输出后不换行 | Console.Write("请输入姓名: "); |
Console.ReadLine() | 读取用户输入的一行文本 | string? name = Console.ReadLine(); |
Console.Clear() | 清空控制台画面 | Console.Clear(); |
Console.ReadKey() | 等用户按一个键 | Console.ReadKey(); |
最常用组合是:
Console.Write("请输入姓名: ");
string? name = Console.ReadLine();
Console.WriteLine($"你输入的是:{name}");为什么先用 Write 而不是 WriteLine?
因为 Write 不换行,用户输入会接在提示文字后面:
请输入姓名: Tom如果用 WriteLine,输入会跑到下一行:
请输入姓名:
Tom这两种都能运行,但输入提示通常用 Write 更清楚。
string? name 为什么这样写
Console.ReadLine() 读取的是用户输入的一行文本,所以结果是字符串。
但是用户可能直接回车,或者输入内容为空。string? 里的 ? 表示这个变量有可能没有有效文本,所以后面正式使用时通常要判断。
今天先记住:
string? name = Console.ReadLine();意思是:从终端读一行输入,放到名字叫 name 的变量里。
常见错误和修法
| 现象 | 原因 | 修法 |
|---|---|---|
dotnet: command not found | .NET SDK 没装好,或终端没有识别到 | 重新安装 SDK,关掉终端再打开 |
Couldn't find a project to run | 当前文件夹没有 .csproj | 先 ls 看文件,再 cd HelloCSharp |
| 改了代码但输出没变 | 文件没保存,或运行的不是同一个项目 | 先保存,再用 pwd 确认目录 |
| C# 报错有行号 | 某一行语法错 | 先改报错行,不要大范围乱改 |
| 中文或英文引号混用 | 代码里用了中文引号 | 代码字符串必须用英文双引号 " |
今天写代码时按这个顺序
- 先确认
dotnet --version能输出版本号。 - 再确认当前文件夹在哪里:
pwd。 - 创建项目:
dotnet new console -n HelloCSharp。 - 进入项目:
cd HelloCSharp。 - 先运行原始项目:
dotnet run。 - 修改
Program.cs并保存。 - 再运行:
dotnet run。 - 如果报错,只看第一条错误。
第二部分:把知识组合成完整例子
前面已经学过最小知识。现在把它们组合起来,先读懂执行顺序,再完整敲一遍。先知道程序最终会做什么,后面会把每个名词拆开讲。
最终你要跑通这个流程
dotnet new console -n HelloCSharp
cd HelloCSharp
dotnet run第一次运行时,终端一般会看到类似结果:
Hello, World!然后你会把 Program.cs 改成下面这样:
Console.WriteLine("Hello, C#");
Console.Write("请输入你的名字: ");
string? name = Console.ReadLine();
Console.WriteLine($"你好,{name}");再次运行后,终端会出现这种交互:
Hello, C#
请输入你的名字: Tom
你好,Tom今天真正要理解的是:为什么输入三条命令就能创建项目,为什么改 Program.cs 会改变输出,为什么输入的名字能被程序打印出来。
第三部分:跟着敲代码
从这里开始动手。每一步都先照做,再看结果。
第 1 步:检查 .NET 是否可用
在终端输入:
dotnet --version如果看到类似下面的版本号,说明 .NET SDK 可用:
9.0.100版本号不需要和这里完全一样,只要能输出版本号就可以。
第 2 步:创建练习文件夹
先找一个你专门放练习代码的位置。下面只是示例:
mkdir csharp-study
cd csharp-study
pwd这三条命令分别表示:
| 命令 | 作用 |
|---|---|
mkdir csharp-study | 创建一个叫 csharp-study 的文件夹 |
cd csharp-study | 进入这个文件夹 |
pwd | 打印当前所在位置 |
第 3 步:创建 C# 控制台项目
输入:
dotnet new console -n HelloCSharp这条命令可以拆开看:
| 部分 | 意思 |
|---|---|
dotnet | 调用 .NET 工具 |
new | 创建新项目 |
console | 项目类型是控制台程序 |
-n HelloCSharp | 项目名字叫 HelloCSharp |
第 4 步:进入项目并查看文件
输入:
cd HelloCSharp
ls你应该能看到类似文件:
HelloCSharp.csproj
Program.cs如果没有看到 .csproj,不要继续运行,先确认是不是进入了正确文件夹。
第 5 步:运行原始项目
输入:
dotnet run如果看到:
Hello, World!说明项目已经能编译和运行。
第 6 步:修改 Program.cs
打开 Program.cs,把里面内容改成:
Console.WriteLine("第一次运行成功");
Console.WriteLine("我正在学习 C# 控制台程序");保存文件,再运行:
dotnet run你应该看到:
第一次运行成功
我正在学习 C# 控制台程序第 7 步:加入输入
继续把 Program.cs 改成:
Console.WriteLine("程序已经启动");
Console.Write("请输入姓名: ");
string? name = Console.ReadLine();
if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("没有输入姓名");
}
else
{
Console.WriteLine($"你好,{name.Trim()}");
}
Console.WriteLine("程序结束");运行:
dotnet run第一次输入 Tom,应该看到:
程序已经启动
请输入姓名: Tom
你好,Tom
程序结束第二次直接按回车,应该看到:
程序已经启动
请输入姓名:
没有输入姓名
程序结束这个例子已经包含了今天最重要的闭环:输出提示、读取输入、判断输入、输出结果。
第 8 步:练习 Console 常用方法
把 Program.cs 替换成下面代码:
Console.Clear();
Console.WriteLine("=== 控制台方法练习 ===");
Console.Write("请输入城市: ");
string? city = Console.ReadLine();
Console.Write("请输入职业: ");
string? job = Console.ReadLine();
Console.WriteLine();
Console.WriteLine("你输入的信息如下:");
Console.WriteLine($"城市: {city}");
Console.WriteLine($"职业: {job}");
Console.WriteLine();
Console.WriteLine("按任意键结束程序");
Console.ReadKey();运行后,你会看到:
=== 控制台方法练习 ===
请输入城市: Shanghai
请输入职业: Developer
你输入的信息如下:
城市: Shanghai
职业: Developer
按任意键结束程序这段代码里:
| 代码 | 作用 |
|---|---|
Console.Clear() | 先清空终端画面 |
Console.WriteLine("=== 控制台方法练习 ===") | 输出标题并换行 |
Console.Write("请输入城市: ") | 输出提示但不换行 |
Console.ReadLine() | 读取输入 |
Console.WriteLine() | 输出一个空行 |
Console.ReadKey() | 等用户按键后结束 |
每日小测
做完本页后,用这 5 题检查是否真的掌握。
1. 判断题
本页的目标不是只把代码运行起来,还要能说清楚“为什么这样写”。
答案:对。能运行只是第一步,能解释原理、常用操作和常见错误,才说明本页内容进入了可复用能力。
2. 填空题
本页主题是:环境搭建与 Hello World。今天至少要掌握的 3 个点是:
1. 终端、命令、文件夹、项目分别是什么
2. `.NET SDK`、`dotnet`、`.csproj`、`Program.cs` 分别负责什么
3. C# 程序从代码到运行结果,中间发生了什么答案:以上 3 点必须能用自己的代码跑通,不能只停留在阅读。
3. 流程题
遇到本页相关功能时,先按什么顺序处理?
答案:先看完整例子,确认最终效果;再读原理和名词;然后跟着第三部分从空项目敲代码;最后对照作业答案检查。
4. 找错误题
如果本页代码运行失败,第一步应该做什么?
答案:先看终端或 IDE 里的第一条错误,找到文件名和行号;不要同时改很多地方。再回到本页的“常见错误和修法”表格,对照错误类型逐项排查。
5. 改需求题
在本页完整例子跑通后,至少改一个小需求。
可选改法:
- 改一个字段名称。
- 多加一个校验条件。
- 多输出一行结果。
- 把固定数据改成用户输入。
- 把一次处理改成多条数据处理。
答案标准:修改后能重新运行,并能说明这次修改影响了哪一段逻辑。重点检查:终端、命令、文件夹、项目分别是什么。
上位机专项练习
上位机首先也是一个普通的 .NET 程序。今天先建立创建项目、启动程序、读取一行输入和看到输出的最小闭环。
下面 3 个例子都要亲手敲。先运行原代码,再完成每个例子后面的改动任务。
专项例子 1:打印上位机启动信息
Console.WriteLine("设备监控程序启动");运行结果或界面效果:
设备监控程序启动改动任务: 把程序名称改成“温度采集上位机”,重新运行。
专项例子 2:读取工位名称
Console.Write("请输入工位名称: ");
string? stationName = Console.ReadLine();
Console.WriteLine("当前工位: " + stationName);运行结果或界面效果:
请输入工位名称: 1号装配线
当前工位: 1号装配线改动任务: 输入另一个工位名称,观察输出变化。
专项例子 3:输出启动检查清单
Console.WriteLine("[1] 加载配置");
Console.WriteLine("[2] 初始化通信");
Console.WriteLine("[3] 打开监控界面");运行结果或界面效果:
[1] 加载配置
[2] 初始化通信
[3] 打开监控界面改动任务: 增加第 4 步“开始采集数据”。
第四部分:作业完整答案
这一部分给出当天作业的完整答案。先按第三部分做一遍,再用这里检查。
作业要求
创建一个叫 HelloCSharp 的控制台项目,完成下面三件事:
- 运行项目,确认能看到输出。
- 修改
Program.cs,输出固定文字。 - 读取用户输入的姓名,并打印问候语。
完整命令
mkdir csharp-study
cd csharp-study
dotnet new console -n HelloCSharp
cd HelloCSharp
dotnet run完整代码
把 Program.cs 改成下面这样:
Console.WriteLine("Hello, C#");
Console.WriteLine("我已经知道 Program.cs 是入口文件");
Console.Write("请输入你的名字: ");
string? name = Console.ReadLine();
if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("你没有输入名字");
}
else
{
Console.WriteLine($"你好,{name.Trim()}");
}正确运行结果
输入 Tom 时:
Hello, C#
我已经知道 Program.cs 是入口文件
请输入你的名字: Tom
你好,Tom直接按回车时:
Hello, C#
我已经知道 Program.cs 是入口文件
请输入你的名字:
你没有输入名字你要能说清楚这 5 件事
dotnet new console -n HelloCSharp是创建控制台项目。cd HelloCSharp是进入项目文件夹。dotnet run会先编译再运行。Program.cs是今天主要修改的代码文件。Console.ReadLine()读取到的是用户输入的一行文本。
加强作业:写一个环境检查程序
这道题专门练第一天的“环境”和“Console 常用方法”。
要求:
- 输出当前程序启动成功。
- 读取姓名。
- 读取当前学习目录。
- 输出整理后的结果。
- 最后等待用户按键退出。
完整答案:
Console.Clear();
Console.WriteLine("=== C# 环境检查 ===");
Console.WriteLine("程序已经启动成功");
Console.Write("请输入你的姓名: ");
string? name = Console.ReadLine();
Console.Write("请输入你的学习目录: ");
string? studyFolder = Console.ReadLine();
Console.WriteLine();
Console.WriteLine("=== 检查结果 ===");
if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("姓名: 未填写");
}
else
{
Console.WriteLine($"姓名: {name.Trim()}");
}
if (string.IsNullOrWhiteSpace(studyFolder))
{
Console.WriteLine("学习目录: 未填写");
}
else
{
Console.WriteLine($"学习目录: {studyFolder.Trim()}");
}
Console.WriteLine();
Console.WriteLine("如果能看到这段文字,说明 Console 输出、输入和判断都已经跑通。");
Console.WriteLine("按任意键结束程序");
Console.ReadKey();你要能说清楚:
Console.Clear()是清屏。Console.WriteLine()是输出并换行。Console.Write()是输出但不换行。Console.ReadLine()是读取一整行输入。Console.ReadKey()是等待按键。