资讯详情

C# 10与.NET 6源码仓库:从环境配置到脚手架复用的实践指南

📅 2026/10/13 18:07:11 | 华诺云谱 👁 阅读
C# 10与.NET 6源码仓库:从环境配置到脚手架复用的实践指南
简介C# 10与.NET 6共同构成了现代跨平台应用开发的技术底座其语言特性与SDK版本紧密绑定理解net6.0目标框架与global.json的版本锁定机制是避免编译环境错配的前提。通过dotnet CLI校验SDK、还原NuGet依赖、运行示例工程开发者可快速在Visual Studio 2022或VS Code中验证样例代码。从控制台应用进阶到ASP.NET Core Web API源码仓库以多工程引用的方式模拟真实项目依赖帮助学习者在任意章节独立编译。对日常工程实践而言将章节中的字符串处理、集合计算等扩展方法提取为通用类库可显著提升代码复用效率。围绕C# 10与.NET 6配套源码仓库的目录组织、SDK选型与常见坑点提供了一套可直接复用的实操路径适合刚接触跨平台开发的初学者和需要在.NET 6项目中快速定位技术示例的开发者。1. 拿到配套源码仓库之前先搞清楚C# 10和.NET 6能省多少事刚开始学C# 10和.NET 6的时候我抄书里的代码常常抄出一堆编译错误后来才发现是环境版本和书不一致。这个仓库把书里所有章节的示例代码按目录分好每个工程都能独立运行省掉了我对照书稿重新敲一遍的功夫。它不是一份PDF也不是讲义而是一套可以克隆下来直接编译的源码库。适合两类人一是正在读那本现代跨平台开发著作、想要一个“后悔药”的新手二是项目里要用.NET 6想快速找某个技术点可用代码的老手。拿到它之后最重要的一件事不是急着翻代码而是先检查环境。2. 仓库结构与运行环境先看目录再动手少走一半弯路这个仓库不是“下载完就能跑”的黑匣子它更像一套按章节拆好的实验手册。如果你一上来就直接打开最新章节的工程大概率会被一堆没见过的扩展方法和项目引用绕晕。我建议按“环境对齐 → 目录梳理 → 辅助文件检查”三步走先花半小时搞懂它怎么长出来的再动手跑代码。2.1 运行环境选型.NET 6 SDK、编译器与IDE怎么配这本书的核心技术栈是C# 10和.NET 6所以第一步必须是装对SDK版本。C# 10的语言特性比如global using、extended property patterns、record struct是随着.NET 6 SDK一起发布的。如果你机器上只有.NET 8 SDK打开仓库里的项目时虽然也能编译但有些项目会因为目标框架是net6.0而提示需要单独的.NET 6 SDK建议。最常见的错误是开发者在旧电脑上装了.NET Framework的开发环境然后自然以为“只要装了Visual Studio就能编译.NET 6项目”结果dotnet命令根本不存在。常见做法是安装.NET 6 SDK的最新补丁版本也就是6.0.x。注意这里一定要选SDK而不是Runtime。Runtime只能运行已编译的程序不能执行dotnet build和dotnet run。安装时用操作系统的包管理器或官方安装器都可以关键是在安装完成后打开终端执行dotnet --list-sdks确认输出里包含6.0开头的版本。我拿到的机器往往同时存在多个SDK版本这时不要盲目卸载因为其他项目可能需要旧版本正确做法是让仓库自己决定用哪个SDK。IDE方面我个人会优先用Visual Studio 2022因为它对.NET 6项目有成熟的模板和调试器集成。如果你更习惯轻量环境用VS Code安装C#扩展也能编译和调试只是首次加载时会提示生成assets文件需要稍等几秒。无论用哪个IDE底层调用的都是同一个dotnet CLI所以只要SDK版本对齐IDE之间的差异不会造成编译结果不一致。不同IDE的差异更多体现在快捷键、断点窗口和启动配置文件上我一般会先让读者在命令行跑通一个项目再用IDE打开这样排查问题时更容易分清是代码问题还是IDE配置问题。dotnet --list-sdks这条命令会列出当前机器上安装的所有SDK版本。假如你的输出里只有7.0或8.0却没有6.0就需要补装.NET 6 SDK。如果同时存在多个版本仓库里的global.json会决定实际使用哪个版本这一点我们在2.3节单独说。参数说明不需要任何参数直接运行即可。输出格式是版本号加安装路径比如“6.0.428 [/usr/share/dotnet/sdk]”。判断标准是看6.0大版本存在不需要纠结具体补丁号。为了让命令输出更友好你还可以加上--feature-band来查看每个feature band的分布但一般用不到。除了SDK本身还要注意目标框架的问题。仓库里的csproj文件会写成net6.0这决定了你在编辑代码时能用哪些API。很多新人会把net6.0误认为是.NET Standard或者把它和.NET Framework 4.8搞混实际上net6.0是只有.NET 6以及更高Mainstream support版本才识别的TFM。如果你用旧版Visual Studio 2019去打开net6.0项目即使装了.NET 6 SDK也会提示“不兼容”因为VS 2019缺少对net6.0目标框架的识别逻辑。这也是我长期只用VS 2022跑这套源码的原因。2.2 章节目录映射从控制台到Web API工程如何组织仓库的目录结构基本与书的目录一一对应。每一章通常是一个文件夹文件夹名带章节号比如Chapter01、Chapter02。章节内部会放一个或多个csproj工程文件还有对应的Program.cs或控制器类。之所以按章拆工程是为了让读者在任意一章停下来都能编译运行不需要从第一章开始按顺序构建。真实项目里一个解决方案往往包含多个工程这个仓库的做法就是在模拟这种依赖关系。下面是一个典型的章节映射关系不同印刷版本可能有细微差异。章节范围典型工程类型主要知识点第1~5章控制台应用变量、类型、控制流、方法第6~7章控制台应用 类库面向对象、接口、泛型集合第8~9章控制台应用 数据库项目EF Core、LINQ to DB第10章控制台应用异常处理、日志跟踪第11章ASP.NET Core Web APIREST API、模型绑定、Minimal API第12章Blazor Server / WebAssembly组件、双向绑定不要太在意每一章的工程名称重点是看它的“引用关系”。比如第7章的类库会引用第6章定义的集合类型第11章的Web API会复用之前章节的实体类。这些引用在csproj文件里以ProjectReference形式存在而不是把代码复制多份。好处是改动实体类后所有引用它的工程一起重新编译符合真实项目里“拆分工程、按依赖构建”的习惯。如果你想看仓库里一共有多少个解决方案文件可以在根目录执行下面这条命令find . -name *.sln -maxdepth 2这条命令会递归查找两层以内的sln文件。输出通常会列出多个解决方案比如Chapter08.sln、Chapter11.sln每个解决方案对应一到两章的内容。这样做的好处是章节之间的共享代码不会重复出现在两个sln里而是通过引用外部工程来复用。参数说明-name *.sln指定匹配以sln结尾的文件-maxdepth 2限制查找深度避免把磁盘上无关的旧工程也翻出来。如果你用的是Windows PowerShell没有find命令可以用Get-ChildItem -Filter *.sln -Recurse -Depth 1达到类似效果。我这里给的是macOS和Linux环境下的写法Windows上我一般直接打开根目录用dll搜索。打开sln之后建议先看“解决方案资源管理器”里的依赖树。如果一个控制台工程底下出现“项目”引用而不是“程序集引用”说明它依赖仓库里的另一个类库。这时要把那个类库项目一并加载否则编译时会报“找不到project”的错误。这种现象在第8章之后特别常见因为数据库访问层被抽成了独立类库。2.3 仓库里那些“看不见”的辅助文件global.json、NuGet.Config与.gitignore很多人在克隆仓库后第一次执行dotnet restore发现报错SDK版本不匹配原因多半是仓库根目录的global.json。这个文件用来固定SDK版本保证所有开发者在同一版本下编译。它的内容很简单类似这样{ sdk: { version: 6.0.100, rollForward: latestFeature } }这个配置的意思是要求SDK版本至少是6.0.100并且允许向后滚动到最新的feature band但不跨大版本。如果你机器上装的是6.0.402rollForward的latestFeature会允许使用它因为6.0.402和6.0.100属于同一主版本6.0。如果你机器上没有6.0.x的任何SDK只有7.0dotnet就会直接报错并告诉你缺少的版本区间。解决办法后续避坑章会详细讲这里先提醒你检查这个文件。NuGet.Config的作用更隐蔽。它可能指定了额外的package source比如某些数据库驱动或图表库的私有源。如果还原时总有一个包提示“unable to resolve”先检查这个文件看是不是source配置指向了一个当前访问不到的地址。我一般会先在命令行执行dotnet restore看到具体是哪个包失败再调整。如果仓库没有这个文件NuGet会默认使用全局配置里的公共源。.gitignore则负责忽略bin、obj、.vs文件夹这些生成目录不应该进入版本控制。你可以直接拿来作为自己项目的模板它比很多网上找的版本更贴合.NET项目毕竟它就是这本书配套仓库里经过验证的清单。我习惯把.gitignore复制到自己的新项目根目录再补上自己的用户文件忽略规则比如.vscode/settings.json和.idea/这样就不会误提交IDE配置。检查完这三件套你大概已经心里有数这个仓库不是一堆零散的代码而是一个有依赖关系的多工程解决方案。下一章我会带你从第一个控制台项目开始把整个编译运行的链路走通顺便说一下首次还原包会遇到什么情况。3. 从克隆到跑通第一个示例完整可复现的步骤环境对齐之后就可以动真格了。这章我会按“克隆 → 还原 → 运行 → 调试配置”的顺序来每一步都给你可以直接执行的命令。如果你在任何一个步骤卡住回到第5章的避坑清单里找对应现象大部分问题不是代码写错而是环境或路径问题。3.1 克隆仓库与首次还原git clone、dotnet restore先找一个干净的目录放仓库。不要直接在桌面上右键解压zip因为zip少了Git历史而且很多仓库里的子模块和.gitignore信息会丢失。我用Git命令行来克隆git clone https://example.com/path/to/cs10dotnet6.git cd cs10dotnet6 dotnet restore第一行把仓库克隆到当前目录。请把其中的example.com/path/to/cs10dotnet6.git替换成书籍前言或出版社页面上给出的实际仓库地址。如果你已经在书上看到的是zip下载链接下载后也要解压到全英文路径下后面会解释为什么。第二行进入仓库根目录。第三行是重点dotnet restore会遍历当前目录下所有csproj文件分析每个项目的PackageReference并从NuGet源下载对应的包。第一次执行时耗时最长因为需要还原所有章节的依赖包括Entity Framework Core、ASP.NET Core相关的包总量可能有几百MB。还原成功的标志是命令退出码为0终端里没有红色的error。如果你看到类似“NU1301”的提示表示某个包在配置的源里找不到这就要回到NuGet.Config的位置去排查。后面避坑章会专门讲。这里有两个小技巧。第一你不需要还原所有章节只还原你当前关注的章节会快很多命令是dotnet restore Chapter11/Chapter11.csproj。第二如果目的是把整个仓库跑一遍可以用dotnet restore如果只是练习我建议只还原当前章减少无关依赖的干扰。3.2 运行第一个控制台项目dotnet run 与 --project 参数仓库里最简单的工程一般是第1章或第2章的“Hello World”项目。在你进入某个章节目录后运行项目用下面的命令dotnet run --project Chapter01/Chapter01.csproj这里假设Chapter01目录下有一个名为Chapter01.csproj的工程文件。如果实际文件夹名不一样先使用ls查看一下内容再替换成对应的目录和文件名。--project参数指定要运行的工程避免dotnet run在当前目录递归扫描出多个项目然后让你选择。如果你想给程序传命令行参数比如书里某个例子会用到args数组可以这样写dotnet run --project Chapter01/Chapter01.csproj -- --name World两个连字符后面的内容会作为参数传给Program的Main方法。在代码里你能通过args[0]访问到字符串“World”。很多初学者会漏掉两个连字符导致dotnet run误以为后面的字符串是它自己的参数程序拿不到任何输入。第一次运行前dotnet会自动调用build把源码编译到bin/Debug/net6.0目录。如果你发现输出窗口里没有显示内容检查终端是不是在工程目录下或者用了错误的相对路径。我见过有人把--project写成了-p然后报错“找不到可运行的项目”这是因为在dotnet run里-p不是--project的缩写必须完整写。3.3 在Visual Studio 2022与VS Code里运行的差异启动配置与输出编码如果你使用Visual Studio 2022直接打开对应的sln或csproj文件按F5启动调试。VS会自动帮你配置好launchSettings.json里面包含项目路径、启动环境变量等一般不需要手动改。唯一需要注意的是“启动配置”不能再选IIS Express因为仓库里的控制台项目没有IIS宿主应该选择“Chapter01”这个以项目名命名的配置。VS Code就麻烦一点。首次打开包含C#项目的文件夹时右下角会弹出“Required assets to build and debug are missing”点击“Yes”后会自动生成.vscode文件夹里面包含launch.json。如果没有自动生成需要手动创建下面是一个最简可用的控制台调试配置{ version: 0.2.0, configurations: [ { name: .NET Core Launch (console), type: coreclr, request: launch, preLaunchTask: build, program: ${workspaceFolder}/bin/Debug/net6.0/Chapter01.dll, args: [], cwd: ${workspaceFolder}, console: internalConsole } ] }这个配置里preLaunchTask指定启动前先执行名为build的任务任务在tasks.json里定义VS Code生成时会一并创建。program指向编译出来的dll路径注意项目名要替换成你自己当前工程的程序集名称这个名称通常在csproj文件的AssemblyName或项目文件名里。console设为internalConsole时输出会跑到“调试控制台”设为integratedTerminal会跑到集成终端两种都有用。如果你遇到“无法定位.NET Core调试器”多半是C#扩展的OmniSharp版本太旧升级扩展后重启窗口即可。在Windows上中文输出乱码是另一个常见差异。Windows控制台默认代码页是936GBK而.NET 6在Linux和macOS上默认是UTF-8。你可以在终端里先执行chcp 65001切换到UTF-8代码页再运行dotnet run或者在启动配置文件里把console改成externalTerminal。具体避坑后面还会提这里先留个印象。4. 把示例改成自己的练习复制工程、改命名空间与调试技巧这套仓库的价值不只是用来对照阅读它还能当练习模板。我的习惯是把每章的例子复制一份改成自己的命名空间然后填充新的逻辑。复制工程的过程其实只有三步但第二步很容易被忽略导致编译出一堆“类型存在于两个地方”的错误。4.1 复制工程并改独立命名空间三步避免项目冲突第一步在文件系统里复制整个工程目录。比如你想把Chapter05的某个集合示例改成自己的练习就先复制一份命名为MyCollectionDemo。注意不要使用带空格或中文的路径后面用命令行时会有转义麻烦。第二步打开复制的csproj文件修改AssemblyName和RootNamespace。很多人在复制后只改.cs文件里的namespace却忘了两个属性还指向旧名称结果编译器生成程序集时仍然使用旧名字调试时加载的是旧dll改了代码没反应。PropertyGroup OutputTypeExe/OutputType TargetFrameworknet6.0/TargetFramework AssemblyNameMyCollectionDemo/AssemblyName RootNamespaceMyCollectionDemo/RootNamespace /PropertyGroup这段是csproj里的核心配置。AssemblyName决定编译输出文件名RootNamespace决定新建文件的默认命名空间。把两者改成一致可以让项目文件层级和命名空间对应起来。如果你不打算改工程名至少要把RootNamespace改成你的练习名否则当你复制多个示例时它们会共用同一个namespace调用时就会出现namespace冲突。第三步把所有.cs文件里的namespace Chapter05;或块语法改成namespace MyCollectionDemo;。C# 10支持文件作用域命名空间写法更简洁但要小心别只改了一半旧namespace残留会导致using定位错误。我一般用全局搜索替换把Chapter05替换成MyCollectionDemo一次搞定。4.2 常用命令组合dotnet new、dotnet build、dotnet watch复制旧工程并不是唯一入口你也可以用模板新建一个干净的控制台项目再把示例的核心逻辑搬进来。这时用到的是dotnet newdotnet new console -n MyPractice -o MyPractice dotnet build MyPractice/MyPractice.csproj dotnet watch run --project MyPractice/MyPractice.csproj第一行新建一个名为MyPractice的控制台项目-n指定项目名-o指定输出目录。如果省略-oVS会在当前文件夹下生成同名目录。第二行编译项目确保没有语法错误。第三行启动“监视模式”以后修改任意.cs文件保存项目会自动重新编译运行。dotnet watch是这个仓库里最值得用到的命令之一。书中的示例往往有多个运行分支你修改输出逻辑后不需要手动CtrlC再运行watch会监听文件变化并重启。它的缺点是重启期间如果有编译错误终端会一直停在错误信息里这时需要按两次CtrlC退出然后手动运行dotnet run看看具体报错。使用watch时如果项目是一个Web API它只会监听调试会话环境变量ASPNETCORE_ENVIRONMENT会被设置为Development这正好符合日常练习场景。如果发现watch模式下某些静态文件不生效检查一下是不是改了不在监听范围内的文件例如obj目录下生成的内容。4.3 断点与调试遇到输出不对时从调用栈找问题跑通示例之后练习自然进入调试阶段。我常用的方式是在可疑的代码行左侧点一个红色圆点然后按F5启动调试。下面是一个常见的示例片段var numbers Enumerable.Range(1, 5) .Select(n n * n) .ToList();如果你觉得结果应该是[1,4,9,16,25]但实际输出是错的就在ToList这一行打断点然后单步执行Select的lambda表达式。调试器的“局部变量”窗口会显示n的当前值和n * n的结算中间值。这里最容易看出来的问题不是语法而是你误把n n写成了n * n之类的细节错误。另一个常用排查点是调用堆栈窗口。如果你在调试一个被多个方法调用的工具类调用堆栈会显示是从哪个上层方法进入当前方法的。很多人拿到示例后直接改动底层方法却不知道有哪些调用方依赖它一旦输出变化堆栈就是找出影响范围的最好工具。如果你没有IDE纯命令行也可以用dotnet run配合System.Diagnostics.Debug.WriteLine输出日志然后在终端里观察。但效果终归不如断点直观。所以我建议至少装一个支持调试的IDE哪怕是VS Code也行你不需要背全套快捷键会用“续行”、“进入方法”、“跳出方法”三个按钮就能排查90%的问题。5. 避坑指南SDK版本、NuGet包与中文乱码的五个经典坑这一章的内容来自我实际使用这个仓库时的“翻车”记录。每条都是先写现象再给原因和解决办法你按照顺序排查就好。5.1 还原失败global.json锁定了旧SDK版本现象在仓库根目录执行dotnet restore终端直接报错“SDK version 6.0.100 cannot be found”后面的还原过程完全终止。原因这个仓库里放置了global.json要求SDK至少为6.0.100。如果你的机器安装的是更新的6.0.x比如6.0.400理论上满足major版本但global.json里的rollForward策略如果不是latestFeature或latestMajor它就只认精确版本或者当前feature band。解决先用dotnet --list-sdks看自己机器有哪些SDK然后编辑global.json把version改成你拥有的版本或者设置rollForward为latestFeature。我一般是这样处理的{ sdk: { version: 6.0.100, rollForward: latestFeature, allowPrerelease: false } }这里rollForward: latestFeature表示即使安装了比6.0.100更新的feature band也允许使用。allowPrerelease: false禁止使用预览版SDK。修改后重新运行dotnet --version确认输出不是报错就能继续。注意如果你是为了练习而非贡献代码修改本地global.json没有影响但要小心不要为了“让项目跑起来”就把SDK版本改成7.0因为很多API行为变了。5.2 编译报错NuGet包版本和示例代码不匹配现象还原成功但dotnet build时报错比如找不到某个扩展方法的定义或者类型转换失败。原因书籍配套仓库里的包版本以出版时间为准而你的本机NuGet缓存可能已经持久化了一个不同版本的包。更常见的情况是你在“第9章数据库”示例里把Entity Framework Core包手动更新到了最新版结果API签名变了旧代码调用不了。解决先看报错信息里涉及的包名和版本然后对比csproj里的PackageReference。如果确认是版本问题一种做法是锁定原始版本打开csproj把Version改回仓库原本写好的版本另一种做法是接受新版本然后按新API调整代码。我一般建议初学阶段锁定原版本因为书中的代码就是按那个版本写的升级是后续工作。你还可以用下面的命令快速看到项目所有包的解析版本dotnet list MyProject/MyProject.csproj package这条命令会列出直接依赖和传递依赖以及每个包的解析版本。排错时先找到报错的包再决定是降级还是改代码不要把build日志里的几百行直接当噪音跳过。5.3 中文乱码Console输出编码与代码页现象运行示例程序所有中文注释和字符串在控制台里变成“????”或者方块。原因在Windows上控制台默认代码页是936GBK而.NET 6的Console输出默认使用操作系统的ASCII或UTF-8编码两者不一致导致中文无法正常显示。Linux和macOS上这类问题少因为终端默认UTF-8。解决最简单的方法是在终端里先执行chcp 65001切换到UTF-8代码页再运行dotnet run。如果不想每次手动操作可以在Program.cs开头加入这样一行代码Console.OutputEncoding System.Text.Encoding.UTF8;把这行放在所有输出之前确保控制台用UTF-8解码输出字节。注意它只影响当前进程如果输出重定向到文件还要同时设置输入编码。我还见过一种特殊情况在同一窗口先执行过早期版本的.NET程序更改了代码页这时重启终端就恢复了。5.4 项目运行后没有输出终端窗口一闪而过现象在文件管理器里双击exe或者在VS中按CtrlF5结果黑框一闪就关了什么都看不到。原因控制台程序执行完所有代码后自动退出。如果你在IDE里启动了“无调试”模式窗口在进程结束时会第一时间关闭根本来不及看输出。解决不要直接双击bin/Debug/net6.0下的exe。要么用命令行运行dotnet run --project Chapter03/Chapter03.csproj要么在代码末尾加一行Console.ReadLine()让程序等待你按回车再退出。如果是Visual Studio建议用F5调试运行这样即使程序退出输出也会停留在“输出”窗口里。为了练手我更推荐在末尾加ReadLine它顺便让你能在程序结束前看到中间变量。5.5 VS Code下调试卡住launch.json参数与工作目录现象在VS Code里按F5程序状态栏显示“正在启动”但断点一直没命中终端也没有输出只能强制停止。原因大多数情况下是launch.json的program路径指向的dll不对或者cwd没有指向包含Program.cs的项目目录。VS Code自动生成的配置有时会用错误的workspaceFolder拼接路径导致启动后加载的不是你正在编辑的项目。解决先检查launch.json中的program是否和实际生成的程序集一致。可以在VS Code终端运行ls Chapter08/bin/Debug/net6.0/Chapter08.dll看到dll存在后把launch.json里的program改成${workspaceFolder}/Chapter08/bin/Debug/net6.0/Chapter08.dll。同时确保cwd是${workspaceFolder}/Chapter08因为程序里的相对路径比如读取文件都依赖它。修改后重启调试会话断点就能正常命中了。这五条坑覆盖了我遇到过的大部分“环境问题”。有很多看起来像代码bug实际上只是运行环境和仓库当时的SDK约定不一致。遇到问题先对照这个清单能省下不少时间。6. 把仓库变成“脚手架”从示例代码提取可复用的工具类我把这套仓库从头到尾跑过几遍之后最大的收获不是记住了语法而是攒了一批可以直接复用的“代码片段”。比如第4~6章里常用的字符串处理、集合计算的逻辑几乎每个项目都能用上。没必要每次都重新写直接把这些方法提取到一个独立类库里就变成了自己的脚手架。一个典型的例子是把一段字符串变成每个单词首字母大写的扩展方法。书里可能使用这样的写法你可以直接复制并放到自己的StringExtensions.cs里public static class StringExtensions { public static string ToProperCase(this string input) { if (string.IsNullOrWhiteSpace(input)) return input; return string.Join( , input .Split( ) .Select(w w.Length 0 ? char.ToUpper(w[0]) w[1..] : w)); } }这段代码定义了一个静态类通过this string input把它挂到string类型上。调用时只需要写hello world.ToProperCase()。注意w[1..]是C# 8引入的range表示法在C# 10下自然可用用来取从第二个字符开始的子串。如果你使用的代码风格不喜欢range可以改成w.Substring(1)。提取完扩展方法后建议顺手写一个最小验证用例否则你没法确认在复制过程有没有丢代码。我的验证方式是新建一个控制台工程引用这个类库然后打印输出Console.WriteLine(hello world from dotnet 6.ToProperCase());运行后能输出Hello World From Dotnet 6说明扩展方法生效。如果输出和预期不一致先检查方法里的Split( )是不是漏了过滤空白字符串。这里顺便提醒如果你从仓库多个章节里复制方法要注意方法名冲突比如两个类都定义了GetFullName这时需要改命名空间或者用类名静态调用。从那以后我每次拿到一份新代码仓库都会先看global.json和csproj的TargetFramework再跑第一个示例然后把觉得能复用的方法抽出来放进自己专门维护的Common项目里。这个习惯帮我少踩了很多“跨项目粘贴代码结果找不到方法”的坑。如果你也有自己的常用代码集不妨把这本书的仓库当作素材库按你的实际需求摘取而不是只把它当一本“能跑的书”。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑