ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

零基础C#编程入门:从Hello World到面向对象与调试

零基础C#编程入门:从Hello World到面向对象与调试

简介:《C#编程新手入门指南》以单份PDF电子书形式呈现,对应《C#玩家指南》第三版内容,面向零基础或刚接触.NET的编程学习者,帮助其从语法入门逐步过渡到可独立完成小项目。全书按入门、基础、面向对象、高级主题与工具实践展开,覆盖变量与类型系统、基本数学与用户输入、判断、switch、循环、数组、枚举、方法、值与引用类型,并深入类与对象、继承、多态、泛型等核心概念;后段还涉及文件、异常、线程及借助Visual Studio 2017和.NET平台提升开发效率的实用技巧。压缩包仅含1个PDF文件,大小约9.27MB,便于在电脑或平板上阅读,也可按章节检索知识点。目前已有131人学习,适合希望边读边练、系统建立C#知识框架的初学者作为入门读物。

1. 零基础学 C#:这门语言到底是个什么东西

很多人第一次听到 C# 编程,脑子里冒出来的是满屏看不懂的符号,还没开始就先怯了三分。其实把它拆开看,C# 就是一种给电脑下命令的语言:你按它能读懂的格式写清楚先做什么、再做什么、什么情况下做什么,它负责把这些话翻译成机器能执行的动作。它长在 .NET 这个平台上,天生带一套现成的工具箱,写窗口、读文件、连数据库都有零件可以直接拿。这份 C# 编程新手入门指南面向的正是完全没碰过代码的人,从装软件、写下第一行输出开始,一路走到面向对象编程、高级主题和调试技巧。所以先别急着背语法,记住一件事就够了:C# 是一门能边写边看结果的语言,你今天敲下的每一行,几分钟内就能在屏幕上跑起来。

2. 为什么零基础也值得先学 C#:三个能立刻感受到的好处

2.1 语法规矩多,但它几乎不跟你玩玄学

刚入门的人最容易在两个极端里摇摆:一种是觉得编程全靠天赋,一种是觉得只要背完语法就万事大吉。C# 恰好站在中间偏"讲道理"的那一侧。它是一种强类型语言,意思是你在声明一个变量时,必须说清楚这个变量装的是整数、小数还是文字。听起来像是多了一道手续,实际用起来反而是给新手省事:类型对不上的地方,编辑器当场就给你画红线,根本轮不到程序跑起来再莫名其妙地崩掉。

举个最常见的场景。你想把一段文字塞进一个只能装整数的变量里,在很多松散的语言中,这件事可能悄悄成功,然后在几百行之外引发一个完全看不出原因的故障,排查起来非常让人头疼。C# 不会这样,它在编译阶段就直接拦住你,告诉你哪个文件、哪一行、哪个类型不对。错误被提前暴露,这是新手最需要的东西——你不需要有多年经验,也能从提示里读出"哦,这里我放错东西了"。

这种设计还有一个隐性好处:它逼着你养成"先想清楚数据长什么样,再动手写逻辑"的习惯。很多人学编程卡住,不是因为不会写循环,而是因为脑子里对"我要处理的东西究竟是什么"一片模糊。C# 的类型系统像一个随身提醒,每次声明变量都在问你一遍这个问题。等你把这套习惯带到别的语言里,会发现思路清楚很多。

所以别把语法规矩当成负担。它的作用类似自行车上的辅助轮:刚开始觉得别扭,骑顺了之后你根本感觉不到它的存在,只会在快要摔倒时发现它其实救过你。

2.2 一套工具走完全程:Visual Studio 把编译、运行、调试收进一个窗口

学编程最怕的不是难,是"碎"。写代码用一个软件,编译要敲命令,运行要开终端,出错要靠猜——四件事分散在四个地方,新手的光是把流程走完就已经耗尽耐心。这份资源配套的主角是 Visual Studio,它把这些环节收进了同一个窗口:左边写代码,上方点一下就能编译运行,出问题时可以在某一行打个断点,让程序跑到那里停下来,你把鼠标悬在变量上就能看见它此刻的值。

这个"停下来看看"的能力,是新手和老手之间最明显的一道分水岭。没有它的时候,程序出了错你只能靠打印语句一遍遍试,像在黑屋子里摸开关。有了调试器,你能亲眼看着数据一步步流动,哪一步开始不对劲一目了然。书里专门用了两章讲这件事:一章讲怎样充分利用 Visual Studio 的各种面板和快捷操作,另一章讲怎样真正调试自己的代码。这两章被放在最后一部分,很多读者一开始会跳过,我建议反过来——早点看,早点受益。

对零基础的人来说,工具选对能省掉大量无谓的消耗。你不需要先学会命令行编译、不需要手动管理一堆配置文件,新建一个项目,模板已经帮你把骨架搭好,你只需要往里面填自己的那几行。等以后需要更精细的控制,再去了解背后发生了什么也不迟。

2.3 学完一段就有一段的用处:从控制台到窗口程序的连续坡道

很多编程入门材料有个通病:前三分之二都在讲语法,最后突然告诉你"现在你已经学会了",然后就没有然后了。学习者拿到的是一堆零散零件,却不知道能拼成什么。这份指南的结构不是这样,它的五大部分是一条连续的坡道,每一段都有明确的落点。

第一段是起步:认识这门语言、装好工具、写出第一个程序、学会写注释。第二段是基础:变量、类型系统、数学运算、接收用户输入、条件判断、循环、数组、方法。走到这里,你已经能写出"输入一批数字,算平均值并判断是否及格"这类小工具了。第三段是面向对象编程,从"创建自己的类"讲到属性、继承、多态、接口、泛型,中间还插了一个完整的井字棋项目——这是很多人第一次真切感受到"代码可以组织得这么有条理"的时刻。

第四段是高级主题:读写文件、错误处理与异常、委托与事件、Lambda 表达式、线程与异步编程。这一段不需要一次啃完,可以当成工具箱,遇到需要的时候回来翻。第五段讲工具和环境:.NET 平台是什么、依赖和多个项目怎么管、常见编译错误怎么读、项目文件是怎么组织的。这一部分最容易被忽略,却直接决定你从"能写"到"能交付"的距离。

坡道的好处是,你在任何一个位置停下,手里都有能拿出手的东西。这比"学完再说"踏实得多。

3. 第一次动手:装好 Visual Studio,跑通 Hello World

3.1 安装这一步:选哪个版本、勾哪些工作负载

安装是整个入门路上第一个容易劝退的环节,不是因为难,而是因为选项太多。打开下载页面,你会看到好几个版本,名称里带社区、专业、企业之类的字样。对个人学习和练手来说,选那个标注为个人可用的版本就够了,功能上不缩水,写代码、调试、跑项目该有的都有。

安装器启动后会给出一长串"工作负载"复选框,这一步比选版本重要得多。新手只需要盯住和 .NET 桌面开发相关的那一项,勾上它,C# 编译器、运行时、项目模板就都齐了。其余像游戏开发、移动开发、数据处理的选项,现在勾了只会让安装包体积翻倍、装的时间拉长,等以后真要用再回来加。

安装过程通常要下载好几个 G,慢是正常的。我见过有人装到一半以为卡死了,直接关掉重来,结果反复折腾一晚上。血泪经验是:插上电源,找个网速稳定的时间段,让它自己跑完,中间别去点取消。装完之后第一次启动会比较慢,因为它在初始化各种缓存,第二次就快了。

提示:如果你用的是 Mac 或者 Linux,书里专门有一节讲这两种系统上怎么写 C#。核心概念和 Windows 上完全一致,只是编辑器长得不一样,碰到对不上的地方,按概念去找对应功能就行。

书里配套的是 Visual Studio 2017 那一代,界面和现在的新版本有些差别,但新建项目、编译、运行这几个关键动作的位置基本没变。照着做的时候如果发现按钮挪了位置,先在顶部菜单里找"文件"和"生成",八成就在里面。

3.2 新建项目:项目、解决方案、程序集分别是什么

这三个词是新手最早遇到的拦路虎,它们听起来很像,其实是三个层级。用一个装修的比方:解决方案是整个工地,项目是工地里的一间房子,程序集是房子盖好之后交出来的成品。一个解决方案可以装好几个项目,比如一个负责界面、一个负责数据处理;每个项目单独编译,产出一个程序集,形态通常是可执行文件或者库文件。

新建的时候,你会先建一个解决方案(通常编辑器会帮你顺手建好),然后在里面加一个项目。项目类型选控制台应用,这是最适合入门起步的形态——它没有界面,所有交互都在一个黑底白字的窗口里用文字完成,你可以把全部注意力放在逻辑本身,不用分心去摆按钮、调布局。

这里有个很多人踩过的坑:一个解决方案里放了多个项目之后,点运行却跑了另一个。原因是"启动项目"这个设置还停留在旧的那个上。解决办法是在解决方案资源管理器里右键你想跑的项目,选设为启动项目,标题栏会变成粗体提示你当前选的是谁。这个细节书里在讲依赖关系和多个项目的那一章有专门说明,值得提前看一眼。

至于项目文件是怎么组织的、编译产物放在哪个目录、配置文件长什么样,这些内容在靠后的章节里讲。现在你不需要全部搞懂,只需要知道一点:你在编辑器里看到的那些文件,最终会被编译成一个能双击运行的东西,中间的过程工具帮你处理了。

3.3 逐行拆 Hello World:每一行到底在干嘛

新建完控制台项目,编辑器会直接给你一份能跑的代码。它很短,但每一行都值得弄明白,因为后面几百页的内容都是在这几行上长出来的。

using System; // 引入 System 命名空间,后面才能直接用 Console 这类工具 namespace HelloWorld // 命名空间,相当于给这段代码挂一个门牌号,避免重名 { class Program // 类,C# 里所有代码都必须住在某个类里面 { static void Main(string[] args) // 程序的入口,运行时从这里开始执行 { // 往控制台窗口输出一行文字,写完自动换行 Console.WriteLine("Hello, World!"); // 等待用户按回车,防止窗口一闪就关掉 Console.ReadLine(); } } }

第一行的using System;是"取工具"。C# 把功能按命名空间分组,控制台输出这个能力放在 System 组里,不写这一行,下面就用不了 Console。你可以把它理解成"我要用 System 这个抽屉里的东西,先把它拉出来"。

namespace那一行是给代码编地址。想象两个项目里都有一个叫 Program 的类,没有命名空间的话编译器就分不清谁是谁。日常写小练习时它不太起眼,等你的项目变大、引用了别人的库,这层隔离就变得很重要。

class Program和里面的大括号是 C# 的硬性规定:所有可执行代码都要放在某个类的方法里,不能像某些脚本语言那样直接在文件顶层写语句。刚开始会觉得这是多余的包装,等你学到面向对象那一部分,就会明白类其实是这门语言组织代码的基本单位。

static void Main(string[] args)是最关键的一行。它是整个程序的入口点,运行程序时,机器就是从这里开始一行一行往下走的。static表示它不需要创建对象就能调用,void表示它跑完之后不返回结果,括号里那个参数用来接收命令行传进来的内容——现在用不上,先知道它在那儿就行。

最后两行是实际动作:Console.WriteLine往窗口打印一句话,Console.ReadLine停下来等用户敲回车。后者经常被新手忽略,结果就是程序跑完窗口立刻消失,看起来像什么都没发生。

3.4 编译和运行:按下启动按钮之后发生了什么

代码写完,接下来是让它跑起来。顶部工具栏有两个长得差不多的按钮,一个带绿色三角的"启动",一个是"启动但不调试"。快捷键上,前者通常是 F5,后者是 Ctrl+F5。对新手来说,日常练习优先用带调试的那个,因为程序出错时它能停下来告诉你哪儿出了问题;而"不调试直接启动"跑得更快,适合你已经确认没问题、只想看看输出的时候。

按下按钮之后,背后发生的事分三步。第一步是编译:编译器把你写的 C# 代码翻译成中间语言,这个过程中会检查语法、类型是否匹配,发现问题就停下来,在下方列出错误清单,双击某一条能直接跳到出错的那一行。第二步是运行:生成的可执行文件被启动,运行时环境接管,从 Main 方法开始执行。第三步是输出:控制台窗口弹出来,你写的文字出现在里面。

编译这一步值得多说两句。新手最容易犯的错是漏掉行尾的分号,或者把英文括号打成了中文括号。这类错误在编辑器里通常会有红色波浪线提示,鼠标悬上去能看到原因。还有一种情况是代码看着完全正确,但报错指向一个你根本没改过的地方——那多半是前面某一行少了右括号,导致后面全乱了套。养成从报错行往上找的习惯,比盯着报错那一行死看有效得多。

另外补充一个和排版有关的小知识:C# 里空格、换行、缩进这些空白字符对程序运行没有任何影响,你把一行代码拆成三行写,结果是一样的。但分号不能省,它是语句结束的标志。这一点书里在第一个程序那一章就专门强调过,因为它是新手编译失败的头号原因。

4. 基础语法主线:变量、类型、判断、循环怎么串起来学

4.1 变量和类型系统:给数据准备合适的盒子

变量的概念一句话就能说清:它是一个有名字的盒子,你把数据放进去,之后用名字就能取出来。C# 的要求是,做盒子的时候必须说清楚这个盒子装什么——整数用一个型号,小数用另一个型号。这就是类型。

类型这么多,新手先记住四个就够开工:int装整数,用来数数、记年龄、算数量;double装小数,用来算平均分、百分比;bool只有真和假两个值,用来做判断;string装文字,名字、提示语都靠它。剩下的一堆,等真遇到需要节省内存或者处理金额精度的场景再回来看。

类型装什么什么时候会用到
int整数计数、年龄、循环次数
double小数平均分、比例、坐标
decimal高精度小数金额、价格,别用 double 算钱
bool真 / 假条件判断的结果
string文字名字、提示语、一整段内容
char单个字符代号、单个字母

给变量起名也有讲究。a、b、c能跑,但过两天你自己都看不懂。用有意义的名字,比如studentCount、totalScore,代码的可读性会立刻上一个台阶。书里在讲变量的那一章专门有一节叫"好的变量名",值得花五分钟读一遍,这个习惯越早养成收益越大。

关于数据在内存里怎么存、值类型和引用类型有什么区别,这些内容在基础阶段可以先放着。它们是理解后面面向对象的关键,但一上来就钻进去,很容易在还没写过几行代码的时候就被概念淹掉。

4.2 判断和循环:让程序学会选择和重复

到目前为止,程序都是一行行往下执行的直线。判断和循环把这条直线变成了有分支、能折返的路径,编程的威力从这里开始显现。

判断用if。它的写法是把条件放在括号里,条件成立就执行大括号里的内容。条件本身是一个 bool 值,通常由比较运算符算出来,比如age >= 18。多个条件可以用&&(并且)和||(或者)连起来,!表示取反。if后面可以跟else,处理条件不成立的情况;再复杂的可以用else if一层层往下排。

int score = 76; // 假设这是某次考试的分数 if (score >= 90) // 第一个条件:90 分及以上 { Console.WriteLine("优秀"); } else if (score >= 60) // 上面不成立时才检查这里 { Console.WriteLine("及格"); } else // 前面都不成立,走这里 { Console.WriteLine("不及格"); }

执行顺序是从上往下逐个检查,一旦某个条件成立,执行完对应的大括号就直接跳出整个结构,后面的不再看。这个特性很重要,所以条件的顺序不能乱:如果把score >= 60放到最前面,那 95 分也会被判成"及格"。

当判断的分支特别多、而且都是在比较同一个变量的不同取值时,可以用switch写得更清爽。书里在讲 switch 的那一章还提到一个细节:C# 不允许一个分支执行完自动滑到下一个分支,必须显式写break,这是它和某些语言不一样的地方,也少了一类容易出错的隐患。

循环用来重复。最常用的三种:while是先判断再执行,可能一次都不跑;do-while是先执行一次再判断,至少跑一次;for把初始化、条件、更新三件事写在一行里,适合次数明确的场景。

// 从 1 数到 5 for (int i = 1; i <= 5; i++) { Console.WriteLine($"第 {i} 次循环"); // $ 开头表示字符串里可以直接嵌变量 }

for括号里那三段用分号隔开,分别是:初始值i = 1,循环条件i <= 5,每轮结束后的更新i++(意思是加一)。执行流程是:先初始化,然后判断条件,成立就跑循环体,跑完执行更新,再回去判断,如此往复,直到条件不成立为止。这个流程值得在纸上画一遍,理解了它,后面几乎所有循环相关的 bug 你都能自己定位。

循环里还有两个开关:break直接跳出整个循环,continue跳过本轮剩下的部分直接进入下一轮。刚开始不用刻意记,遇到需要的时候查一下就行。

4.3 数组和方法:把一堆数据和一段逻辑各自打包

学到这儿,你已经能用变量存单个值、用判断做选择、用循环做重复。但真实的问题往往涉及一批数据,也往往需要把某段逻辑反复使用。数组和方法就是解决这两件事的工具。

数组是一排连续的盒子,用同一个名字加编号来访问。声明的时候要写明类型和长度,索引从 0 开始,这一点新手经常搞错。

// 声明一个能装 5 个整数的数组 int[] scores = new int[5]; scores[0] = 88; // 第一个位置,索引是 0 scores[1] = 92; scores[2] = 75; scores[3] = 60; scores[4] = 95; // 第五个位置,索引是 4 // 遍历数组,把每个分数打印出来 for (int i = 0; i < scores.Length; i++) { Console.WriteLine(scores[i]); }

注意循环条件写的是i < scores.Length而不是<=。数组长度是 5,合法索引是 0 到 4,写成小于等于就会越界,程序会直接抛异常。这个错误几乎每个新手都犯过,而且因为它只在循环最后一轮才触发,往往让人一愣。

如果只是想把数组里的东西挨个看一遍,用foreach更省事:foreach (int s in scores)会自动把每个元素依次交给你,不用担心索引越界。

方法则是把一段逻辑打包起来,起个名字,之后调名字就能用。它的好处是重复利用和减少重复。当你发现自己在三个地方写了几乎一样的代码,就该考虑把它抽成方法了。方法的定义包含返回类型、名字、参数列表,用return把结果交出去;如果只是做事不需要返回结果,返回类型写void。

数组和方法这两样东西,是后面所有内容的地基。类是一组方法和数据的打包,泛型是对类型做的抽象,委托是把方法本身当成值来传递——全都建立在你已经会用方法这个前提上。

4.4 串起来跑一个:输入名字年龄,算出明年的年龄

把前面的零件拼起来,写一个真正能交互的小程序。它的流程是:问名字、问年龄、计算、输出。

using System; class Program { static void Main() { // 提示用户输入名字,ReadLine 读回来的永远是字符串 Console.Write("请输入你的名字:"); string name = Console.ReadLine(); // 提示用户输入年龄,读回来的仍然是字符串 Console.Write("请输入你的年龄:"); string ageText = Console.ReadLine(); // 把字符串转换成整数,这一步不能省 int age = int.Parse(ageText); // 整数加法,算出明年的年龄 int nextYearAge = age + 1; // 用加号把文字和变量拼起来输出 Console.WriteLine("你好," + name + ",明年你就 " + nextYearAge + " 岁了。"); } }

几个地方值得展开说。Console.Write和Console.WriteLine的区别只在于一个不换行、一个换行,用在提示语上,前者能让用户的光标停在冒号后面,体验更自然。

Console.ReadLine()的返回值类型固定是字符串,哪怕用户输入的是 100,你拿到的也是"100"这三个字符,不是数字一百。所以必须用int.Parse转一次,这一步是新手最容易忘记的,忘了就会在拼接输出时得到"明年你就 1001 岁"这种结果——因为字符串加整数变成了拼接。

int.Parse有一个明确的软肋:如果用户输入的不是数字,比如打了一个"二十",程序会直接抛异常退出。在练习阶段这没关系,先跑通再说;但这也是最典型的翻车现场,后面讲避坑的时候会给出更稳的写法。

最后那句输出用的是加号拼接。当内容变长,这种写法会变得很难读,所以 C# 提供了字符串插值:在字符串前面加一个$,然后把变量用大括号包起来放进去,效果一样但清楚得多。上面那个循环里的$"第 {i} 次循环"就是这个用法。

5. 新手避坑:五个几乎人人都会遇到的错误

5.1 程序一闪就没了,看起来像什么都没发生

现象:按下运行,黑色的控制台窗口弹出来,一瞬间又消失了,你甚至没看清里面写了什么。

原因:程序从 Main 方法第一行跑到最后一行,执行完就结束了,窗口随之关闭。如果你写的是一个没有暂停的程序,它跑完的时间可能只有几毫秒,肉眼根本来不及捕捉。

解决:在 Main 方法的最后加一句Console.ReadLine();,让程序停下来等用户敲回车。如果你用的是带调试的方式启动,程序结束后窗口通常不会立刻关闭(或者会提示按任意键继续),所以这类问题在调试模式下反而不容易出现,这也解释了为什么有人换一种启动方式就好了。

5.2 代码看着没错,编译却死活不通过

现象:明明照着书写的一模一样,编译器却报错,红色波浪线出现在一些看起来毫不相干的地方。

原因:八成是两个隐形问题之一。一是标点符号用了中文输入法打出来的全角字符,比如中文分号";"、中文括号"()",它们在屏幕上和英文符号几乎一样,但编译器完全不认。二是大小写没对上,C# 是严格区分大小写的,console和Console是两个不同的东西。

解决:把输入法切到英文状态再检查一遍报错行附近的符号。如果报错位置看起来没问题,往上找几行,很可能是前面漏了一个右括号或者右花括号,导致后面的结构全部错位。养成写完一段就编译一次的习惯,比写完几百行再一起排查轻松得多。

5.3 用户输入不是数字,程序直接崩了

现象:程序正常跑起来,输入数字一切正常,但只要手滑输入了字母或者直接回车,程序立刻抛出一堆红色文字然后退出。

原因:int.Parse的职责只有一个——把合法的数字字符串转成整数。它不接受任何"不合法"的情况,一旦遇到就抛异常。而用户永远会输入你没预料到的东西,这是躲不掉的现实。

解决:换成int.TryParse,它不会抛异常,而是返回一个 bool 告诉你转换成不成功,转换结果通过out参数带出来。

// 先声明变量,TryParse 成功后会把结果写进 age int age; bool ok = int.TryParse(ageText, out age); if (ok) { Console.WriteLine("你的年龄是 " + age); } else { // 转换失败时 age 会被置为 0,但程序不会崩 Console.WriteLine("输入的不是数字,请重新运行再试一次。"); }

区别只有一点:一个是"必须成功否则大家都别玩",一个是"先试试,不行我给你个信号"。凡是涉及外部输入的地方,后者基本都是更稳妥的选择。

5.4 除法算出来的结果总是整数

现象:算平均分或者比例的时候,明明应该是 2.5、3.75,结果屏幕上显示的是 2 或者 3,小数部分凭空消失了。

原因:两个整数相除,C# 会执行整数除法,结果自动截断成整数,不是四舍五入,是直接砍掉小数部分。5 / 2得到 2,1 / 3得到 0。这个规则本身没问题,问题出在很多人在写的时候没意识到两边的类型都是整数。

解决:让参与运算的两个数里至少有一个是小数类型。最简单的做法是在字面量后面加个.0,或者把其中一个变量声明成double。

int total = 5; int count = 2; Console.WriteLine(total / count); // 输出 2,整数除法 Console.WriteLine(total / (double)count); // 输出 2.5,强制转成小数再除

括号里那个(double)是类型转换,意思是"把这个值临时当成 double 来用"。记住一条经验:只要涉及除法又希望得到小数,就提前把类型处理好,别等结果不对了再回来查。

5.5 改了代码,运行结果还是老的

现象:明明改了输出内容,运行起来却还是显示旧的结果,反复确认代码确实存盘了。

原因:常见的有两种情况。一种是改了文件但没保存,编辑器标题栏上那个小圆点就是"未保存"的标记,编译的是硬盘上的旧版本。另一种更隐蔽:一个解决方案里放了多个项目,启动项目还停在上一个,所以你运行的根本不是你以为的那份代码。

解决:先按 Ctrl+S 保存,看标题栏的小圆点是否消失;还不对,就去解决方案资源管理器里确认启动项目,右键目标项目选"设为启动项目",粗体那个才是当前会跑的。再不行就清理一次解决方案重新生成,把旧的编译产物删掉重来。这类问题排查起来没有任何技术含量,但卡住的人非常多,因为它违背直觉——你会一直以为自己代码写错了。

6. 学完基础往哪走:从面向对象到 .NET 的爬坡路线

6.1 三个阶段,别跳着走

基础语法跑通之后,很多人会迫不及待地去找"高级"内容看,结果被一堆概念砸懵,回头怀疑自己不适合这行。更稳的做法是分三段走,每段都有明确的判断标准。

阶段主要内容走完的标志
第一段:面向对象编程创建自己的类、属性、继承、多态、接口、泛型能自己设计两三个类并把它们组合起来完成一个小功能
第二段:高级主题文件读写、异常处理、委托与事件、Lambda、线程与异步能写出读写文件、出错不崩、界面不卡的程序
第三段:工具与环境.NET 平台、多项目依赖、常见编译错误、调试、项目文件组织能独立新建工程、定位报错、配置引用

第一段是分水岭。在这之前,你的代码是一堆按顺序执行的语句;在这之后,你开始用"对象"来建模问题。井字棋那个小项目就是很好的练习,它需要棋盘、玩家、判断胜负这几块拼在一起,逼着你思考类该怎么划分。这一关过了,后面就顺了。

第二段不用一次啃完。文件读写和异常处理用得上就先学,委托和异步可以等遇到实际问题再回来翻。第三段最容易被跳过,但它决定了你从"能写"到"能交付"的距离,尤其是调试那一章,我建议在第一段结束之后就回头补上。

6.2 每天二十分钟的练习习惯

有个很实在的建议:每天写二十分钟,但不要追求写完一个大项目。具体做法是,把书里每一章的示例代码亲手敲一遍,敲完立刻改一处——把输出文字换掉,把判断条件的数字调大,把循环次数改成用户输入。改完跑一遍,观察结果怎么变。

这个动作看着幼稚,效果却出奇地好。因为照着抄只是手指在动,改动才逼你去理解每一行在起什么作用。我第一次学的时候图省事,整章整章地复制粘贴,看着都能跑,一到自己写就一片空白,那种感觉非常打击人。后来改成手动敲、随手改,进度慢了,但再也没出现过"看着会、写不出"的情况。

还有一条:把遇到的每一个报错记下来,写清楚现象、原因、怎么解决的。三个月之后你会积累出一份属于自己的错题本,它比任何教程都贴合你的薄弱点。从那以后我每跑一个新项目,都会先确认启动项目是哪一个、有没有未保存的文件,再按运行——这个小习惯帮我省掉了无数个"代码明明改了为什么没生效"的下午。希望这些能帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进