十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C#基础练习题:从字符串处理到上位机与Socket实战

C#基础练习题:从字符串处理到上位机与Socket实战 简介面向C#初学者的基础练习题资源包内容覆盖基本语法与数据类型、控制结构、函数与方法、数组与集合、类与对象、接口与抽象类、异常处理、枚举与委托、文件与流、LINQ查询、异步编程、泛型等核心知识点适合通过大量编码练习夯实C#基础、提升编程技能的学习者。资源压缩包为rar格式共1670个文件整体约17.87MB其中以cs源代码文件为主体同时包含sln解决方案、csproj工程文件、exe可执行程序和dll库文件便于直接打开项目对照运行与调试另有jpg、ico等图片资源丰富示例效果。目前已有725人学习下载。练习题按主题组织从变量声明到泛型、委托事件和异步方法等进阶内容均有涉及读者可在编写与运行过程中逐步理解值传递与引用传递、继承多态、文件读写及LINQ查询等关键机制配合完整工程文件边改边跑能有效内化知识点为后续独立开发奠定扎实基础。1. 从项目标题说起为什么要做一套C#基础练习题我一直觉得C#是一门“入门容易、精通难”的语言。见过太多人学完语法就说自己会C#了结果一到真实项目里连字符串截取都要查半天资料更别提什么反射、事件、Socket这些在工业场景里天天要用的东西。这正好印证了那些高频搜索词背后对应的情况大家搜“C# 截取字符串”“C# 扫码枪触发事件”“C#上位机”说明真正困扰初学者的不是语法本身而是“语法到底怎么用在干活上”。这套练习题就是奔着解决这个痛点去的。它不是什么高深的东西就是把日常开发里最高频的 C# 知识点拆成一道一道可动手的题目每道题都尽量贴近真实工作场景。比如截取字符串这种题不是让你在控制台里切个“hello world”就完事而是做一个类似解析串口上报数据的练习背后带出 Substring、Split、IndexOf 这些方法的取舍。适合谁来刷这套题呢我的答案是已经看完基础语法、但还没怎么写过真实业务代码的人准备面试、想快速把基础知识过一遍的求职者以及刚转到C#方向、需要把语言特性和实际场景挂钩的开发者。如果你属于这三种人这套题能帮你少走很多弯路。2. 设计练习题时的整体思路和避坑逻辑2.1 不能只围绕语法本身出题我见过太多练习题集翻来覆去就是“用for循环输出1到100”“定义一个类再new一个对象”这种题做了十道和做了一道没区别。真正的问题在于语法糖是死的用法是活的。做题的时候就要逼自己去想这个功能在什么场景下会被用到比如说 C# 里的 byte 和 char面试官很喜欢考实际工作里更是绕不开。串口通讯收上来的数据是 byte 数组你要按协议解析出里面包含的字符串读文件的时候编码不对中文全是乱码网络传输时字节序反了解析出来的数值完全不对。这些全都是 byte 和 char 这两个基础类型在真实世界里的映射。所以我出练习题的第一条原则是每个语法点都必须挂靠到一个具体的场景上。语法是工具场景才是目标。2.2 做题要模拟真实开发的“找资料”状态除了一些必须靠记忆的基础题大部分练习题我故意不把代码写完整只给需求描述和核心提示。为什么因为真实开发中谁不是一边查文档一边写代码关键是“知道查什么、查完之后怎么改”。比如有一道题是让练习者自己实现一个针对字符串拼接的 StringBuilder 和普通字符串拼接的性能对比我不会直接给出完整代码而是提示他们去查 Stopwatch 类怎么用然后自己写循环自己测数据。这个“查资料写代码看结果”的循环就是工作最真实的状态。2.3 练习题的“验收标准”必须明确每道题我都习惯搭配验收标准。不是说代码能跑就行而是要跑出明确的结果。比如字符串解析那道题标准是输入一段“AA:BB:CC:DD”格式的帧数据能正确拆出每一段并且转成大写Socket 那道题标准是能在一台机器上成功连上自己写的服务端并且连续发 1000 条消息不丢包。有了验收标准练习才有终点不然一口气写出来就算完等于没练。3. 核心练习题拆解字符串、编码与类型转换3.1 字符串截取不只是 Substring 那么简单字符串处理是C#新手最应该练扎实的一块但很多人的做法就是背一个 Substring 方法遇到题就套。真实情况是不固定长度的字符串、带分隔符的一串数据、夹杂中英文和数字的组合处理起来完全不是一回事。举一个基础练习题的例子给定一个字符串“datetime2025-06-08 14:30:00|value23.5|statusok”要求分别取出日期时间、数值和状态。直接用 Substring 确实能写但每次都要自己数偏移量一旦字段顺序变了代码就废了。这时候更好的方案是用 Split(|) 先切出三块再用 Split() 取出每块的键和值。我在练习题里专门搞了一组对比第一小题限定用 Substring第二小题限定用 Split第三小题不限定让大家自己选并说明理由。很多练过的人反馈做完这套对比之后才真正理解为什么说“Split 更稳、Substring 更可控”。3.2 byte 与 char编码转换里的门道说到 C# 里的 byte 和 char只能说这是新手最容易翻车的地方没有之一。关于 byte 和 char 的题目我设计了几个由浅入深的题具体来说第一题给定一个中文字符串分别用 Encoding.UTF8、Encoding.Unicode、Encoding.GetEncoding(GB2312) 转成 byte 数组输出每个数组的长度观察同一个中文字符在不同编码下的字节数差异。这题的目的是让人直观感受编码的区别。第二题把一串 byte 数组反转后重新解码成字符串。很多人在练习里第一次发现不是所有 byte 数组都能无损还原成原来的字符串原因就在于编码时的 BOM 和字节序问题。第三题模拟从通讯缓冲区里读取一个长度为 4 字节的 int 值需要把 byte 数组按大小端转成整数。这题不建议用 BitConverter而希望大家手动通过移位来算一遍。做完之后再去查 BitConverter理解会深刻得多。这三道题的共同价值在于它们锻炼的不是记 API 的能力而是“对内存里数据形态的感知力”。C# 毕竟是一门托管语言底层的东西被包装得很好但包装越精致出了问题越难查。提前在练习题里把这些坑踩一遍到正式做上位机、做通讯协议解析时就能省下大量调试时间。3.3 类型转换隐式与显式的边界类型转换也是基础练习题的重点板块。int 转 long 是隐式的long 转 int 会有溢出风险string 转 int 必须用 int.Parse 或者 TryParse但 TryParse 更安全这个知识点已经快被写烂了但写归写真正用对的人不多。我的练习题里有一道经典的“坑题”让练习者判断这段代码的输出——double a 10.5; int b (int)a; Console.WriteLine(b);输出是多少答案是 10不是 10.5 也不是 11。C# 的显式数值转换是“截断”而不是“四舍五入”。这一个知识点就能刷掉不少自认为基础很好的人。这类题放进练习题能让学习者快速意识到“我知道这个语法”和“我真的理解这个语法”之间的差距。顺带补充一个更进阶的部分自定义类之间的类型转换操作符。很多人不知道类也可以定义隐式转换和显式转换实际上在写一些 DTO 转换、值对象封装时这个技巧非常实用。练习题里会给出一个简单的温度类让练习者用implicit operator和explicit operator实现摄氏度和华氏度之间的互转。4. 结合真实场景的进阶练习题从反射到单例模式4.1 反射从“看着头晕”到“上手就懂”反射是C#面试高频考点也是很多初学者觉得“抽象到没法理解”的知识点。抽象的原因在于大多数练习代码都是照着文档敲一个GetType()然后输出几个属性名完全不知道这东西在生产环境里到底干什么用。我的处理方式是把反射练习题做成一个迷你ORM框架的雏形。给定一个user表有 id、name、age 三个字段用 ADO.NET 把查询结果 DataTable 转成 ListUser但不直接写死赋值逻辑而是通过反射读取 User 类的属性再按属性名去 DataTable 里找对应列。这个练习做完反射能干什么、为什么要用反射、什么时候不推荐用反射基本就有感觉了。更进阶一点还可以练习“反射调用私有方法”。在实际工作中确实有这种场景你要给一个老系统写单元测试但有些方法被设计成了 private测试代码没法直接调这时候只能通过反射把私有方法拿出来调用。练习题里提供一个简单的类和一个 private 方法要求用反射完成调用并检查返回值。4.2 单例模式从理论到真正写对单例模式是C#开发面试必问的设计模式但很多人只停留在背代码的阶段。我的练习题要求不可止步于“写出一个单例”而是要求写出线程安全版本并解释为什么加锁、为什么用双重检查锁定、为什么用 volatile 修饰字段。练习题中给出一个场景上位机程序里要记录日志日志组件必须全局唯一不然多个窗口打开、多个线程写文件时会出现文件占用异常。要求分别用四种方式实现懒汉式非线程安全版加锁版双重检查锁定饿汉式静态字段初始化使用 LazyT 的版本做完这四版之后还要对比启动性能和内存占用写一段测试代码来验证每种方式在并发调用时的行为。这题练完面试官再问单例已经不是问题了。4.3 事件机制模拟扫码枪触发扫码枪触发事件这个热搜词非常有意思。很多人不理解扫码枪就是一个输入设备它扫出来的条码本质上就是键盘输入的一串字符怎么触发事件答案是通过事件机制。在 WinForms 或 WPF 中扫码枪会触发控件的 KeyPress 事件你需要判断回车键把缓冲区里的字符串取出来再把打包好的条码数据传给后续处理逻辑。练习题的设计是新建一个 WinForms 项目界面上有一个 TextBox模拟扫码枪输入在文本框里连续输入一串字符最后按回车回车时触发事件从文本框里取出完整字符串解析出条码编号再设计一个更新界面标签的事件用来显示扫码结果更进一步抽象出一个ScannerService类扫码枪的输入事件和界面更新之间用事件解耦。这样以后再接入工业相机扫码、PDA扫码逻辑都能复用。4.4 面试题结合练习in 参数、结构体和对象判空C# 面试机械题很多比如 in 参数修饰符是干嘛的、结构体和类在内存分配上有什么区别、JObject 如何判断是否包含某个字段。这些都可被设计成小练习。例如 in 参数的设计意图是“以只读方式传递引用类型或值类型”。练习题要求写一个场景定义一个只读结构体类型方法传入 in 参数读取内部数据再尝试修改字段编译阶段就报错——让练习者直观看到 in 参数的限制是如何在编译期起作用的。结构体与类的区别我会让人做一个列表操作练习Listint 和 ListMyClass 在插入一万条数据时的耗时和内存占用差异让数据说话。JObject 判断是否包含某字段则在练习题里模拟接收一段 JSON 字符串要求解析出来之后判断某个字段是否存在再输出对应信息。5. 从基础到工程练习题如何服务上位机方向5.1 实验环境准备和基础Socket练习上位机是热搜词里出现频率极高的方向而C#上位机开发最核心的技术是网络通讯。练习题在这个方向上的安排是先用一个简单的控制台程序实现 TCP 通讯。我的做法是给练习者三台“虚拟设备”场景第一题启动一个 TCPListener接收一条字符串消息并原样返回第二题模拟一个温度传感器每隔一秒发送一次温度数据客户端需要解析出数值第三题要求使用异步方式让服务端能同时处理多个客户端连接三题做完基础的同步、异步、粘包、半包问题基本都碰到了。粘包和半包是上位机开发里绕不过的坎练习题里会故意发送一段被拆成两半的数据让练习者体会什么叫“数据没到齐”再去寻找解决方案。5.2 与机器视觉工具的协议配合热搜词里提到海康相机软件 VisionMaster 与 C# 上位机通讯使用什么协议比较好。这个虽然没有标准答案但我的练习题准备过程中涉及到了这个话题因为做上位机方向的人迟早要和视觉系统对接。在练习里我不会让初学者直接去调 SDK而是安排一个模拟练习假装有一个视觉系统通过 TCP 发送“OK”或“NG”的结果数据上位机程序收到后更新界面状态并控制 PLC 信号灯的显示。通过这个练习掌握“数据怎么来、怎么解析、怎么显示”的主流程后续再换成真正的协议只是数据格式不同、底层逻辑完全一样。这里要提醒一句实际工程中视觉厂商通常会提供自己的 SDK 或协议文档有的用 TCP 裸协议有的用 HTTP 接口有的用共享内存。练习题阶段先把 TCP 裸协议吃透后面不管对接什么设备都不会慌。5.3 工业级网口通讯助手的思路引入很多初学者在处理网络问题时顺手就想写一个工具类。练习题到这个阶段我会安排一个“写一个简易网口调试助手”的题目支持 TCP 客户端和服务端两种模式可设置 IP 和端口可收发文本和十六进制数据界面用 WinForms 实现。这道题锻炼的内容远远超过网络本身字符串和 byte 数组的转换十六进制、线程与 UI 的交互跨线程更新控件、异常处理连接超时、端口占用、状态管理连接断开后重连。做完这题之后再看“工业级网口通讯助手”这种项目就不会觉得无从下手了。6. 常见问题与排错技巧实录6.1 字符串截取总是报越界异常这是绕不开的高频报错。原因无外乎 IndexOf 返回 -1或者 Substring 期望的长度超过了剩余字符数。我的建议是在做字符串处理之前先判空、判长度、判断索引是否存在再做裁切。一个小技巧是用 IndexOf 判断找不到时返回 -1 可以提前 return 或者抛异常比让它运行到一半再崩要友好得多。练习题里我故意埋了几个这样的“雷”就是为了让练习者亲身体验一遍越界异常再学会预防性编程。6.2 扫码枪触发事件时 TextBox 总是多出最后一个回车符扫码枪在 WinForms 里模拟键盘输入默认会在输入的字符串后面带一个回车\r。处理方式就是在 KeyPress 事件里判断 e.KeyChar 是否为回车是的话就处理缓冲区内容并清空 TextBox这样就不会把回车带到业务数据里。这个细节看起来很简单但我在实际练习反馈里看过很多人犯的错是用 Trim(\r) 去字符串里硬删倒也不是不行只是加上“判断回车后再处理”这一步会让逻辑更干净。6.3 Socket 编程里客户端连不上服务端最典型的排查顺序先确认服务端有没有监听、监听的是不是 127.0.0.1 或 0.0.0.0 地址、防火墙有没有拦截端口。练习题里我为新人准备了三条排查命令。这种问题的排错思路比知识点本身重要得多毕竟实际开发中八成 Socket 连不上都不是代码逻辑出错而是环境和配置问题。6.4 反射动态调用性能太低怎么办练习题的实验阶段可以用反射随便玩但到了真实工程就要注意反射有性能开销不要在循环里反复调用。常规优化手段是把 MethodInfo 缓存起来重复调用直接 Invoke用表达式树或委托缓存来代替每次反射调用业务层尽量避免动态调用尽量用接口或抽象类6.5 编码问题导致中文乱码很多人在做串口或者网络通讯练习时会遇到中文乱码。一个核心规律发送和接收两边必须用同一个编码。但新手问题常常出现在不知道对方用的是什么编码。练习里我建议多做一步把 byte 数组以十六进制形式打印出来观察编码差异再一一排除。7. 关于练习题长期价值的个人体会真正把C#基础练习题做出感觉之后你会发现自己学到的不是某个孤立的方法或语法而是一整套解决问题的思路。我做这套题的时候最深的体会就是练到后面看业务代码的速度明显变快因为脑子里已经积累了大量“这个场景对应什么解法”的映射不需要再一步步去翻文档。给看到这里的朋友一个实在的建议做题不要贪多每天两三道足够但每道题一定要完全弄明白背后的设计意图和坑点尤其是那些你第一次写错、第一次报错的地方那才是你真正学到东西的地方。本文还有配套的精品资源点击获取
返回列表