ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

C# 泛型、IO流与多线程实战指南

2026/8/3 11:03:29 拓冰建站 浏览量
C# 泛型、IO流与多线程实战指南 目录引言泛型Generics类型安全的通用编程2.1 泛型类与泛型方法2.2 类型约束与协变逆变IO流Input/Output Stream数据的持久化通道3.1 文本文件与二进制文件读写3.2 流的高级用法与资源管理多线程Multithreading并发与性能的提升4.1 Thread、Task与线程池4.2 线程同步与安全集合综合实战多线程批量文件处理重难点总结学习感悟1. 引言C# 作为一门现代编程语言其泛型、IO流和多线程是构建高性能、可维护应用程序的三大支柱。泛型提供了类型安全的复用机制IO流是程序与外部数据交互的桥梁而多线程则能有效利用计算资源提升程序响应速度与吞吐量。本文将三者结合从基础用法到综合实战带您彻底掌握这些核心进阶技能。2. 泛型Generics类型安全的通用编程泛型将类型参数化允许编写适用于多种数据类型的代码同时保留编译时的类型检查避免装箱拆箱和运行时类型转换异常。2.1 泛型类与泛型方法// 泛型类一个简单的容器publicclassBoxT{publicTValue{get;set;}}// 使用示例BoxintintBoxnewBoxint{Value123};BoxstringstrBoxnewBoxstring{ValueHello};Console.WriteLine(intBox.Value.GetType());// System.Int32// 泛型方法交换两个变量的值publicstaticvoidSwapT(refTa,refTb){Ttempa;ab;btemp;}// 使用intx1,y2;Swap(refx,refy);// 编译器自动推断类型2.2 类型约束与协变逆变类型约束限制泛型类型参数以调用特定成员// 约束 T 必须实现 IComparable 接口用于比较publicstaticTMaxT(Ta,Tb)whereT:IComparableT{returna.CompareTo(b)0?a:b;}Console.WriteLine(Max(5,9));// 9Console.WriteLine(Max(a,b));// b协变out和逆变in用于处理类型间的继承关系// 协变子类集合可赋值给父类集合IEnumerableout TIEnumerablestringstringsnewListstring{a};IEnumerableobjectobjectsstrings;// 允许// 逆变父类委托可赋值给子类委托Actionin TActionobjectactObjectobjConsole.WriteLine(obj);ActionstringactStringactObject;// 允许3. IO流Input/Output Stream数据的持久化通道IO流是处理数据读写的抽象System.IO 命名空间提供了文件、内存、网络等多种流实现。3.1 文本文件与二进制文件读写usingSystem.IO;// 文本文件读写最常用stringpathexample.txt;File.WriteAllText(path,这是第一行内容);File.AppendAllText(path,\n这是追加的第二行);stringcontentFile.ReadAllText(path);Console.WriteLine(content);// 读取所有行string[]linesFile.ReadAllLines(path);foreach(varlineinlines)Console.WriteLine(line);// 二进制文件读写处理图片、音频等byte[]data{0x01,0x02,0xFF};File.WriteAllBytes(data.bin,data);byte[]readDataFile.ReadAllBytes(data.bin);Console.WriteLine(string.Join(, ,readData));// 输出: 1, 2, 2553.2 流的高级用法与资源管理对于大文件应使用 StreamReader/StreamWriter 逐行或分块处理并用 using 语句确保资源释放// 使用 StreamWriter 写入大文件using(varswnewStreamWriter(large.txt)){for(inti0;i1000;i){sw.WriteLine($第{i}行数据);}}// 使用 StreamReader 逐行读取using(varsrnewStreamReader(large.txt)){string?line;while((linesr.ReadLine())!null){// 处理每一行Console.WriteLine(line);}}4. 多线程Multithreading并发与性能的提升多线程允许程序同时执行多个任务提升CPU利用率和用户体验。现代C#推荐使用 Task 和基于任务的异步模式TAP。4.1 Thread、Task与线程池usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;// 1. 使用 Thread较底层voidDoWork(){for(inti0;i3;i){Console.WriteLine($工作线程:{i});Thread.Sleep(200);}}ThreadworkernewThread(DoWork);worker.Start();worker.Join();// 等待完成// 2. 使用 Task推荐Task.Run(()Console.WriteLine(Task 方式执行));// 3. 并行循环Parallel.For(0,5,iConsole.WriteLine($并行任务{i}, 线程ID:{Thread.CurrentThread.ManagedThreadId}));// 4. 线程池不直接创建线程ThreadPool.QueueUserWorkItem(_Console.WriteLine(线程池任务));4.2 线程同步与安全集合多线程访问共享资源时需同步避免竞态条件。// 使用 lock 语句同步intcounter0;objectlockObjnewobject();Parallel.For(0,10000,_{lock(lockObj){counter;// 安全递增}});Console.WriteLine($Counter:{counter});// 正确输出 10000// 使用线程安全集合 ConcurrentBagTvarbagnewSystem.Collections.Concurrent.ConcurrentBagint();Parallel.For(0,1000,ibag.Add(i));Console.WriteLine($Bag 元素数:{bag.Count});5. 综合实战多线程批量文件处理场景并行读取多个日志文件统计包含ERROR关键字的行数。usingSystem.Collections.Concurrent;string[]logFiles{log1.txt,log2.txt,log3.txt};ConcurrentBaginterrorCountsnewConcurrentBagint();Parallel.ForEach(logFiles,file{intcount0;if(File.Exists(file)){foreach(stringlineinFile.ReadLines(file))// 使用 ReadLines 惰性读取{if(line.Contains(ERROR))count;}}errorCounts.Add(count);Console.WriteLine(${file}:{count}个错误);});inttotalErrorserrorCounts.Sum();Console.WriteLine($总计错误数:{totalErrors});分析此示例结合了泛型集合 (ConcurrentBag)、IO流 (File.ReadLines) 和多线程 (Parallel.ForEach)展示了三者协同工作的典型模式。6. 重难点总结概念关键点易错警示泛型类型参数、编译时检查、约束误用 object 或 ArrayList 代替泛型集合导致性能损失IO流File 类便捷方法、Stream 类、资源释放忘记 Dispose 导致文件被占用大文件未用流处理导致内存溢出多线程Task、lock、线程安全集合不恰当使用 Thread.Sleep锁定对象使用 this 或字符串导致死锁风险7. 学习感悟通过对泛型、IO流和多线程的系统学习与实践我深刻体会到它们是C#开发中不可或缺的生产力工具。泛型让我告别了为每种类型写重复代码的繁琐它提供的类型安全不仅减少了运行时错误更让代码结构清晰。IO流教会我如何优雅地处理外部数据从简单的配置文件到海量日志选对读写方式如 ReadLines 惰性读取能极大提升程序效率。多线程则是提升性能的利器但也是一把双刃剑——它要求我时刻思考资源竞争和同步问题lock 和 ConcurrentBag 等安全手段成为必备知识。最初感觉这三部分各自独立但在实战中却发现它们紧密相连。例如在高性能日志分析器中我们需要用流读取数据用多线程并行处理最后用泛型集合汇总结果。将三者融会贯通才能编写出真正健壮、高效的应用程序。给初学者的建议先掌握 List、File.ReadAllText 和 Task.Run 这三个最常用的“入口点”解决日常问题。随着经验积累逐步深入 IAsyncEnumerable、MemoryMappedFile、Channel 等进阶特性。永远记住可读性、正确性、性能是编码的优先顺序清晰简洁的代码胜过花哨的技巧。结语泛型、IO流与多线程是C#进阶之路的三座里程碑。理解它们的核心概念、典型用法和协作模式将帮助您在设计系统时游刃有余。希望本文的实践总结能对您有所帮助欢迎在评论区交流心得