尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

C#初级教程:手把手创建第一个控制台程序

C#初级教程:手把手创建第一个控制台程序 先说明一下背景这篇文章是给刚接触C#的朋友写的也是我这些年带新人时固定会用到的第一课。标题叫“C# 初级教程一手把手教你创建程序”那咱们就别整虚的目标就一个从零开始在你的电脑上跑起来第一个C#程序。C#这个语言现在不只是桌面开发上位机、Web后端、游戏开发、工业自动化到处都能见到它的身影所以入门路线选对很重要。这篇教程会覆盖环境安装、工具选择、项目创建、代码解释、调试运行最后还会把新手最常见的坑挨个列出来。适合完全没写过代码的小白也适合有其他语言基础、想快速切到C#体系的人。1. 环境准备与开发工具选型1.1 为什么首选Visual Studio Community很多新手问我学C#到底用什么工具网上说法乱七八糟什么VS Code配插件、Rider、Visual Studio看得人头晕。我的建议很直接第一门课老老实实用Visual Studio Community。这三个工具我都长期用过给你交个底Visual Studio Community是微软官方出的免费IDE功能完整自带编译器、调试器、代码补全、项目模板装完就能干活。VS Code定位是轻量编辑器C#相关的环境需要手动配置一堆东西比如.NET SDK、C#扩展、调试器新手光配环境就能耗掉一下午还容易配出各种奇怪问题。Rider是JetBrains出的商业IDE功能非常强但要收费虽然个人开源项目可以申请免费授权不过对新手来说没必要一上来就折腾这个。我见过太多人第一天学C#就把时间浪费在配VS Code上最后连个“Hello World”都没跑出来心态直接崩了。Visual Studio Community虽然安装包大、启动慢但它所有东西都是开箱即用的对新手来说“省心”比“轻量”重要得多。1.2 下载安装与工作负载选择安装Visual Studio Community直接搜“Visual Studio下载”进微软官网下载Community版安装器。这里有个很关键的坑下载的是一个小型的安装引导程序真正的东西要靠它联网拉取所以安装时网络尽量保持稳定别用校园网这类频繁掉线的网络不然装到一半报错特别折磨。安装器启动后会让你勾选“工作负载”这就是你要装哪些功能模块。做控制台入门程序只需要勾选一个“.NET桌面开发”就够了。这里面已经包含.NET SDK、C#编译器、调试器、WinForms和WPF模板够学好一阵了。右侧还有个“安装详细信息”默认会带一些组件不用动直接点安装就行。我自己的习惯是把“.NET 8.0运行时”这类核心组件留着其他用不到的一概不勾。安装时间取决于网速快的话十几分钟慢的话半个多小时耐心等就行。这里插一句版本问题现在主流LTS版本是.NET 6和.NET 8目前市面上教程基本都在用.NET 6或.NET 8安装器里默认的最新版本直接拿即可。有些老教程让你装.NET Framework或者VS2015那就没必要了技术栈还是跟新的走后面上班或者做项目也更容易接轨。1.3 首次启动与界面布局安装完成后第一次启动Visual Studio会让你选择开发设置和环境主题。开发设置建议选“Visual C#”主题看个人喜好在深色和浅色之间选一个不影响功能。这一步慢点操作因为进到主界面之后再想改就要到“工具 → 导入和导出设置”里去折腾了。主界面需要先认识的区域有三个中间是代码编辑区右边是解决方案资源管理器下边是输出窗口和错误列表。刚打开你可能觉得界面太花了但没关系大部分东西现在用不到。新手只需要记住写代码在中间看文件树在右边看程序运行信息在下边。第一印象建立起来之后别急着点来点去直接进入第一个项目的创建。环境这东西练多了自然就熟了我是强烈不推荐花长时间去背界面上每个按钮是干嘛的。2. 创建第一个C#程序从Hello World开始2.1 新建项目为什么选控制台应用启动Visual Studio后点“创建新项目”你会看到一大排项目模板Windows窗体应用、WPF应用、ASP.NET Core Web应用、类库……这时别慌选“控制台应用”别选成“Windows窗体应用”也别选“WPF应用”那些是带图形界面的入门阶段会被界面代码干扰。为什么先学控制台因为控制台程序只有黑色命令行窗口和文字输出没有任何图形界面元素能让你把注意力100%放在C#语言本身上。图形界面开发动不动就涉及事件、布局、控件绑定这些概念叠加在语言学习上新手很容易搞混。就好比学开车你先在空旷场地上练转向和油门搞明白了再上复杂路面一个道理。项目名称建议起得有辨识度比如“HelloCSharp”或“MyFirstApp”。位置可以默认也可以自己建一个“C:\Projects\CSharpLearning”之类的目录但千万不要放在桌面上也别用中文路径和带空格的路径有些老开发工具对中文路径支持不好报错的时候你根本想不到是路径的锅。解决方案名称保持和项目名一致就行。选择目标框架时优先选“.NET 8.0长期支持”。以后你用到的绝大多数包和教程都兼容咱不贪新不图旧用最稳妥的长期支持版本。点击“创建”之后等几秒一个控制台项目就成型了。2.2 认识解决方案、项目和Program.cs项目创建好之后右边解决方案资源管理器里会有一棵树。结构大概是解决方案“HelloCSharp”包含1个项目→ 项目“HelloCSharp”→ 依赖项、Program.cs。很多人不理解解决方案和项目的关系。给你打个比方解决方案是一个行李箱项目是行李箱里的收纳袋。一个行李箱里可以装好几个收纳袋对应到一个解决方案里可以包含好几个项目。实际工作里的代码经常是启动项目、类库项目、测试项目好几个一起组成的所以理解这个概念会很有帮助。现在这个阶段一个解决方案里只有一个项目你只要知道双击Program.cs打开它这就是我们写代码的地方。Program.cs打开后里面默认有几行代码Console.WriteLine(Hello, World!);就一行对就一行。很多教程到这就让你按F5看到屏幕上输出“Hello, World!”然后说“第一个程序完成”。但我建议你把步骤放缓认真搞清楚下面三件事第一这行代码是什么意思。Console代表“控制台窗口”WriteLine是“写一行”的意思。合起来就是“往控制台窗口输出一行文字”。第二分号结尾。C#几乎每条语句都要以分号结束漏了就会报错。第三这段代码为什么会自动执行。这就牵扯到入口程序的概念我放在后面专门讲。2.3 编译、运行到底发生了什么新手最容易忽略的就是程序从“代码”到“运行结果”之间发生了什么但这恰恰是最值得理解的部分。当你按下F5时Visual Studio会先调用编译器csc.exe把你的C#代码翻译成一种叫IL中间语言的东西这个过程叫编译。IL不是CPU能直接执行的机器码它更像是一种“统一的中间表达”类似把中文翻译成世界语然后由.NET运行时CLR公共语言运行时在运行那一刻把它翻译成CPU能懂的机器码并负责内存管理、垃圾回收等一整套事情。这套机制听起来绕但你可以类比成拍电影你写的C#代码是剧本编译器把剧本翻译成拍摄用的分镜脚本IL导演CLR现场指挥演员把分镜脚本演成能看的电影机器码。所以C#程序理论上可以在任何装了.NET运行时的系统上运行这点跟Java跨平台的思路很像。按下F5的时候Visual Studio其实做了好几件事还原项目依赖的NuGet包、编译代码、启动程序、把调试器挂上去。调试器这个东西后面写复杂程序时就是救命稻草它可以让程序在指定行暂停让你逐行观察变量的值。以后再详细介绍这里先知道有这么个东西就行。3. 核心语法与代码细节第一次写自己的程序3.1 入口点为什么代码从这里开始咱们回到Program.cs。新版.NET的默认项目用了“顶级语句”也就是你不需要写一堆包裹性的东西直接写一行Console.WriteLine就能跑。这是C# 9开始引入的简化写法编译器会在背后自动生成一个Main方法所有顶层语句会被放进这个Main方法里执行。Main方法是所有C#程序的入口点你可以理解成电影的开机画面不管这个程序有多大启动时都先找Main方法从它的第一行代码开始执行。Windows窗体、WPF、ASP.NET Core项目其实也有入口点只是被框架隐藏得更深。顶级语句省去了写Main方法的麻烦但对初学者来说也有个副作用你可能很长一段时间都不清楚Main方法长什么样。我建议你至少要知道经典的写法因为看老代码、网上搜资料时满地都是这种写法using System; namespace HelloCSharp { internal class Program { static void Main(string[] args) { Console.WriteLine(Hello, World!); } } }这段代码每一部分都有含义using意思是“引用哪个命名空间”System里面装着Console等基础类namespace是命名空间用来给代码分组避免重名class定义一个类static void Main是入口方法。现在不要求你背下来但看到它能认出这是标准的入口结构这对以后读教程和理解项目会有很大帮助。3.2 变量与数据类型和计算机对话的基础会输出“Hello, World!”之后下一步就是让程序输出“会变化”的内容。举个例子你想让程序先问用户叫什么名字再跟用户打个招呼。那就需要用到“变量”——用来存数据的小盒子。C#里使用变量有一套流程先声明类型再给名字再赋值。比如string name 张三; int age 18; double height 175.5; bool isStudent true;string是字符串类型存文字int是整数类型存整数double是双精度浮点类型存带小数点的数bool是布尔类型只有true和false两个值。初学阶段先掌握这四种就够了。这里有一个容易踩的坑C#对类型要求很严格int变量不能直接塞字符串string和int相加时要用到“拼接”或者“插值”。插值的写法是字符串前面加个$花括号里放变量名Console.WriteLine($你好{name}你今年{age}岁。);这个$符号非常重要。我见过不少新手把$漏掉结果控制台把{name}当普通文字输出怎么调都不对。记住了看到字符串前面有$说明里面可以用花括号嵌变量没有$就不能这么用。3.3 获取用户输入与字符串处理光会输出还不够程序最重要的是交互。控制台程序里用Console.ReadLine()可以读取用户在控制台输入的整行文字返回结果是string类型Console.Write(请输入你的姓名); string name Console.ReadLine(); Console.WriteLine($欢迎你{name});注意这里是Console.Write不是WriteLine区别是“写完之后不换行”这样光标会停在文字后面用户直接输入名字体验更好。如果你的程序需要读入数字比如年龄那就不能直接存int了因为Console.ReadLine()返回的是字符串。你需要做一次类型转换Console.Write(请输入你的年龄); string input Console.ReadLine(); int age int.Parse(input);int.Parse的作用是把字符串“转换”成整数。这个转换有风险如果用户输入了“abc”程序运行时会抛异常、直接崩溃。更稳的写法是用int.TryParse它不会抛异常而是返回一个bool值告诉你转换成功没有Console.Write(请输入你的年龄); string input Console.ReadLine(); bool isOk int.TryParse(input, out int age); if (isOk) { Console.WriteLine($明年你就{age 1}岁了。); } else { Console.WriteLine(输入的不是有效数字。); }这里out int age的意思是把转换后的整数放到age这个变量里。这段代码看起来比前面复杂但它在处理“用户输入不可控”这件事上更专业。新手前期可以先用int.Parse但至少要见过TryParse写法因为真实项目里几乎不用int.Parse去接用户输入的。字符串处理还有一个高频需求就是截取。比如用户的身份证号或者手机号你想只取前几位或者中间几位可以用Substring方法string phone 13812345678; string head phone.Substring(0, 3); // 138 string tail phone.Substring(7); // 5678Substring的第一参数是起始位置第二个参数是要取的长度没有第二个参数就是取到末尾。C#里索引从0开始这是所有编程语言通用的习惯一开始容易数错位置写多了就顺了。3.4 条件判断与循环让程序有“脑子”程序不只是从上往下一条线跑完它需要根据不同情况做不同处理。最基础的就是if/else上面TryParse的例子就是。除了判断循环也是日常写代码的常客。比如让程序打印1到10这十个数for (int i 1; i 10; i) { Console.WriteLine(i); }for循环有三个部分int i 1是起始条件i 10是继续循环的条件i是每次循环结束后i加1。这个结构看着繁琐其实拆开理解就是“从1开始只要不大于10就一直跑每跑一次加1”。循环和条件这两个东西配合起来程序几十行也能做不少花了。我建议新手一定亲手敲一遍这些例子不要复制粘贴敲错了也没关系因为敲错后看报错的过程就是你开始“认识”C#的过程。4. 实操写一个能对话的完整小工具4.1 需求设计用户信息登记小工具前面讲了很多零散知识点现在把它们串起来做一个真正的小工具。需求如下程序启动后依次询问用户的姓名、出生年份、所在城市然后向用户打个招呼告诉用户今年多少岁最后判断用户是否年满18岁输出对应提示。这个需求不需要图形界面不需要复杂逻辑但用到了变量、输入、类型转换、插值、条件判断非常适合练手。4.2 完整代码与逐行讲解打开你的Program.cs把默认代码全部替换成下面的内容Console.Write(请输入你的姓名); string name Console.ReadLine(); Console.Write(请输入你的出生年份); string yearInput Console.ReadLine(); bool isOk int.TryParse(yearInput, out int birthYear); if (!isOk) { Console.WriteLine(出生年份格式不正确程序即将退出。); return; } int currentYear DateTime.Now.Year; int age currentYear - birthYear; Console.WriteLine($你好{name}今年是{currentYear}年你{age}岁。); if (age 18) { Console.WriteLine(你已经成年了。); } else { Console.WriteLine(你还未成年。); } Console.WriteLine(按任意键退出...); Console.ReadKey();逐行说明一下。前面两行用Console.Write提示用户输入用Console.ReadLine接住返回值存到name变量。接着读出生年份因为要用它算年龄所以必须转成数字。这里的int.TryParse带out int birthYear是“尝试把字符串当整数解析解析成功就把结果放进新变量birthYear”。关键的坑在if (!isOk)。!在C#里是“取反”的意思!isOk就是“如果isOk为false”也就是“如果解析失败”。解析失败就打印提示然后用return直接结束当前Main方法。return这个词在入门阶段很多资料不提但它是控制程序流程的好东西用在“条件不满足就提前退出”的场景非常自然。我让程序在这里退出是刻意展示一种防御式写法程序宁可提前退出也不要带着异常数据继续跑。当前年份用DateTime.Now.Year获取这是C#里获取当前时间的标准做法。年龄就是当前年份减出生年份。严格来说生日没到会有一岁误差但你可以在熟悉基础后再去优化这个逻辑比如再读一个月份、判断是否过了生日。好的练习方式就是“先跑通再完善”。最后的Console.ReadKey()作用是让程序等待用户按任意键再退出。很多人不理解This行是干嘛的实际上在Visual Studio里用F5调试模式运行时如果程序跑完直接退出控制台窗口会瞬间关闭你根本来不及看结果。加上Console.ReadKey()窗口就会停住直到你按键这是控制台程序必备的收尾动作。4.3 调试F5、CtrlF5、断点的区别代码写完之后运行方式有几种新手最容易混。按F5是“开始调试”程序会以调试模式运行。在这种模式下你可以设置断点在代码左侧灰色边栏点一下会出现一个红点程序运行到那一行时就会停下来此时可以悬停鼠标查看变量的当前值。这点很神奇也很实用。比如你在int age currentYear - birthYear;这行前面点上红点运行到这时把鼠标悬停在age上就能看到年龄的具体值。按CtrlF5是“开始执行不调试”程序正常跑只是不会触发断点。新手阶段我建议你分情况用想快速看结果CtrlF5想排查逻辑问题F5加断点。调试器是初学者最该提前掌握的核心技能没有之一。很多人写得代码跑不出预期结果就慌了然后到处问人。其实自己用断点看一遍变量值问题基本就水落石出了。还有个小技巧程序运行完想回看输出内容除了Console.ReadKey()还可以在命令提示符里手动运行exe。打开输出窗口看“输出”里的路径找到Debug目录下的exe手动双击运行窗口关闭前会保留住内容大部分情况够用了。4.4 运行效果与常见偏差如果一切正常程序运行效果大概是这样请输入你的姓名小明 请输入你的出生年份2008 你好小明今年是2025年你17岁。 你还未成年。 按任意键退出...我建议你看到这个效果之后马上做三组测试来确认自己的程序足够稳第一次输入正常数据第二次故意输入字母“abc”作为出生年份看看会不会提示格式错误并退出第三次把出生年份改成2030年看看年龄变成负数。这三组测试覆盖了“正常情况、错误输入、边界情况”哪怕不做专门测试在控制台里手动敲几遍也是好的习惯。如果出生年份输入2025年得出的年龄是0这算正常但也暴露了我们程序的一个短板没有校验出生年份不能晚于当前年份。这就是下一阶段要学的东西——更完善的输入校验。现阶段能把基础流程跑通已经算入了C#这个门了。5. 常见问题与排查技巧实录5.1 速查表7个新手高频问题我陪很多新手一步步调过代码以下问题出现频率最高按“问题 → 原因 → 解决方案”列出来建议收藏备查。问题现象常见原因解决方案控制台一闪而过看不到结果程序运行完自动退出改按CtrlF5运行或代码末尾加Console.ReadKey()输出乱码中文显示成方块控制台代码页与程序编码不一致在代码第一行加Console.OutputEncoding System.Text.Encoding.UTF8;按下F5提示无法启动程序项目配置异常或入口点缺失检查Program.cs是否被误删重新创建项目打开别人的项目提示不兼容/加载失败VS版本或.NET SDK版本不一致用VS Installer安装对应工作负载和SDK或者看项目文件TargetFramework程序报错“当前上下文中不存在名称Console”早期版本缺少using System或项目类型异常确认代码最上方有using System;字符串里{name}原样输出了字符串前少了$符号用${name}插值写法编译通过但运行时崩溃类型转换失败等运行时异常用int.TryParse替代int.Parse并用if判断返回值5.2 聊一下“明明程序没错但运行结果不对”有一种情况特别容易让人抓狂编译器一个错误都不报程序也能跑但输出结果和预期不一样。这种时候别急着怀疑编译器坏了99%是你自己的逻辑或者输入值出了问题。举个例子。我让一个新同事写“把两个字符串拼起来”他写的是string a 10; string b 20; Console.WriteLine(a b);他期望的结果是“30”实际输出是“1020”。原因很简单a和b都是字符串字符串的是拼接不是加法。想求和就得先转数字int.TryParse(a, out int x)这样。这个问题编译器不会提示因为语法上完全正确但它就是不对。所以我把这个案例单独拿出来说程序不等于你心里想的目标程序是你写出来的那几行代码。代码说“把字符串拼起来”计算机就拼起来。搞清楚这一点排查错误的速度能快不少。5.3 版本兼容VS2019、VS2022、VS2015之间换项目热词里总有朋友问“VS2019开发的C#上位机源码程序能用VS2015打开吗”。这个问题在入门阶段也会遇到网络上下的源码不一定能直接用你的IDE打开。说结论源码本身是用C#写的用哪个版本打开跟语言本身关系不大但项目文件格式和框架版本决定兼容性。VS2015主要支持.NET Framework项目如果源码用的.NET Core或.NET 5VS2015大概率打不开或者要装额外的扩展非常折腾。反过来VS2022对老版本.NET Framework项目通常能直接打开顶多提示“安装组件”。最稳的办法是源码项目的目标框架是什么就用支持该框架的较新版Visual Studio打开。也不要听信网上“VS2022打不开旧项目”的传言大部分情况都能打开只是不同项目的SDK版本会让你装一些组件而已。如果你开发上位机、串口相关的C#项目时机成熟后需要引入第三方库比如Modbus库那通常会通过NuGet包管理器来完成。入门阶段先不用管知道这个流程的存在就行。5.4 环境崩了怎么办总有那么一些人包括我自己安装Visual Studio的时候出各种幺蛾子装到一半断网、安装失败、启动闪退、项目模板缺失。遇到这种问题别急着重装系统建议依次试从“Visual Studio Installer”里点“修复”功能如果修复后还是不行再卸载重装。重装时把杀毒软件暂时退掉因为有些杀毒软件会拦Visual Studio的进程。安装目录不要选到非系统盘且带中文的路径这个老生常谈但真有人因此踩坑。如果是因为磁盘空间不足导致安装失败可以先只装“.NET桌面开发”一个工作负载省掉一堆用不到的大组件。装完之后如果突然想用Web项目再打开安装器额外勾选“ASP.NET和Web开发”补装即可不需要重装一整个环境。5.5 控制台窗口里输入了但没反应一种常见情况是Console.ReadLine()一直卡住你敲了内容按回车也没反应。这通常是因为你之前使用了Console.ReadKey()或Console.ReadLine()时在标准输入流中留下了残留字符或状态混乱。直接的做法是把相关代码注释掉重新运行如果项目里用了循环读取检查一下循环的退出条件是否永远不成立。另一种情况是用了Console.Read()读单个字符之后再用Console.ReadLine()会多出一个换行符残留导致第二次读取直接跳过。解决办法是不要混用Read和ReadLine统一用ReadLine后面再解析。这其实就是程序员日常的一部分程序不按预期走先观察再猜测再验证。这个排查周期循环几轮你的调试直觉就慢慢长出来了。6. 下一步方向控制台之外的世界6.1 从“会跑程序”到“会做软件”到这一步你已经成功创建并运行了好几个C#程序掌握了变量、输入输出、条件判断、循环、简单错误处理。这算是一只脚踏进C#的门里了。接下来学习路线怎么走我结合C#的主要应用方向说一下。如果你对带界面的桌面软件感兴趣下一站学Windows窗体WinForms或WPF。WinForms上手快拖控件就能做计算器、记事本WPF更现代界面更灵活但概念也更多。很多人关心WPF能不能做B/S架构的窗体直接用WPF做浏览器里的界面是不行的WPF主要用于Windows桌面客户端B/S架构的界面一般用Web技术做C#对应的技术是ASP.NET Core或者Blazor。这个区分越早建立越好。如果你是冲着工业自动化、上位机来的搜索热词里这类问题特别多控制台打好基础之后可以接触串口通信SerialPort和Modbus协议。上位机本质就是用C#读写设备的数据并进行界面展示与控制涉及的知识点包括串口、TCP、多线程、UI刷新性能优化等。其中“循环数据采集和UI刷新卡顿”就是高频痛点等你学到WPF或WinForms时会绕不开Data Binding和线程调度这些都需要C#语言基础特别扎实。所以别急着跳去上位机把这次教程里的基础吃透后面才会顺。6.2 自学C#的三个习惯最后说三个我反复跟身边人强调的自学习惯。第一个习惯是“每天至少亲手敲一次代码”。看教程敲十遍也没有自己亲手敲一遍来得记忆深刻复制粘贴在入门阶段是最大的敌人。第二个习惯是“敢看英文报错”。C#编译器的报错信息虽然一开始看着吓人但它其实是带坐标的地图。遇到报错先把消息里提到的行号看一遍再看错误描述里的英文配合翻译工具理解你解决过的每一个报错都是实打实的经验。第三个习惯是“动手改参数看效果”。学到一个新功能不要照着原样敲完就完事试着把数字改大改小、把字符串换成别的、把条件反过来看看程序会发生什么。每次“搞坏了”再把代码改回去这个过程比机械练习有用得多。C#是一门非常务实的语言语法体系庞大但用起来顺手市场应用面也广。从今天创建第一个程序开始你就在一条非常清晰的路上了。后面不管是想做桌面工具、Web系统、上位机还是游戏C#都有对应的成熟技术栈等着你。现在打开Visual Studio新建一个控制台项目把本文的例子从头到尾敲一遍比看十篇文章都有用。
返回列表