Skip to Content
Week 01Day 1 - 环境搭建与 Hello World

Day 1 - 环境搭建与 Hello World

建议用时:150-180 分钟

你将学会什么

  • 终端、命令、文件夹、项目分别是什么
  • .NET SDKdotnet.csprojProgram.cs 分别负责什么
  • C# 程序从代码到运行结果,中间发生了什么
  • 如何创建第一个控制台项目并运行
  • 如何修改 Program.cs,再重新运行看到变化
  • Console.WriteConsole.WriteLineConsole.ReadLine 的区别
  • 看到常见报错时,先从哪里排查

本页只讲 C# 控制台基础,不讲任何界面框架。今天的目标不是背命令,而是把“写代码 -> 保存 -> 运行 -> 看结果”这条链路跑通。

本页固定顺序

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

学习衔接

这是整套课程的起点。今天只建立“能创建项目、能运行、能修改、能再次运行”的最小闭环,不提前学习后面的语法。

今天的最低通过线

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

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

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

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

今天先抓住什么

C# 程序不是直接凭空运行的。它需要项目文件告诉 .NET 怎么编译,需要入口文件写程序从哪里开始,需要终端命令启动编译和运行。

今天的主线是:

进入文件夹 -> 创建 C# 项目 -> 得到 .csproj 和 Program.cs -> 修改 Program.cs -> 保存文件 -> dotnet run 编译并运行 -> 在终端看到输出

名词先讲清楚

名词直接解释今天怎么看
终端给电脑输入命令的窗口输入 dotnet run 的地方
命令让电脑执行某个动作的一行文字pwdlscddotnet run
文件夹存放文件的位置项目会放在一个文件夹里
项目一组能一起编译运行的文件HelloCSharp 文件夹
SDK开发工具包,包含编译器和命令电脑能执行 dotnet --version
.csprojC# 项目文件告诉 .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查看当前文件夹里有哪些文件检查有没有 .csprojProgram.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当前文件夹没有 .csprojls 看文件,再 cd HelloCSharp
改了代码但输出没变文件没保存,或运行的不是同一个项目先保存,再用 pwd 确认目录
C# 报错有行号某一行语法错先改报错行,不要大范围乱改
中文或英文引号混用代码里用了中文引号代码字符串必须用英文双引号 "

今天写代码时按这个顺序

  1. 先确认 dotnet --version 能输出版本号。
  2. 再确认当前文件夹在哪里:pwd
  3. 创建项目:dotnet new console -n HelloCSharp
  4. 进入项目:cd HelloCSharp
  5. 先运行原始项目:dotnet run
  6. 修改 Program.cs 并保存。
  7. 再运行:dotnet run
  8. 如果报错,只看第一条错误。

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

前面已经学过最小知识。现在把它们组合起来,先读懂执行顺序,再完整敲一遍。先知道程序最终会做什么,后面会把每个名词拆开讲。

最终你要跑通这个流程

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 的控制台项目,完成下面三件事:

  1. 运行项目,确认能看到输出。
  2. 修改 Program.cs,输出固定文字。
  3. 读取用户输入的姓名,并打印问候语。

完整命令

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 常用方法”。

要求:

  1. 输出当前程序启动成功。
  2. 读取姓名。
  3. 读取当前学习目录。
  4. 输出整理后的结果。
  5. 最后等待用户按键退出。

完整答案:

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() 是等待按键。