2026/6/29 18:21:20

C# 核心 API 与数据结构学习笔记

C# 核心 API 与数据结构学习笔记 在 C# 的学习旅程中掌握核心 API 和常用的数据结构是写出高效、优雅代码的必经之路。本文将带大家回顾 C# 中最基础但也最重要的知识点从字符串处理、基础数据类型、异常处理到泛型与各类集合类的应用一网打尽一、 字符串的艺术String与StringBuilder1.String不可变的字符序列在 C# 中string或String底层是一个字符数组并且是由sealed关键字修饰的这意味着它不能被继承。更重要的是字符串是不可变的——虽然你可以通过索引获取字符如a[0]但你不能直接修改它。常用 API 盘点查找与截取IndexOf()/LastIndexOf()从前/后查找子串第一次或最后一次出现的索引。Substring(startIndex, length)截取字符串常用来提取网址域名等信息。格式转换ToUpper()/ToLower()大小写转换常用于验证码校验。StartsWith()/EndsWith()判断前缀/后缀常用于处理文件类型或路由。拆分与清理Split()按特定字符拆分字符串为数组。Replace(old, new)替换指定内容。Trim()去除字符串两端的空格。String.IsNullOrEmpty()判断字符串是否为空或 null非常实用的判空工具。2.StringBuilder高效的字符串拼接由于String的不可变性频繁拼接字符串会产生大量内存垃圾。这时候就需要用到StringBuilder了。核心优势底层依然是字符数组但支持原地修改。常用操作Append()追加、Insert()插入、Remove()删除、Replace()替换。最后通过ToString()输出结果。二、 常用基础结构数值与时间1. 数值类型 (Int32,Double,Math)常量与转换我们可以通过Int32.MinValue和Int32.MaxValue获取整型的极值。使用Int32.Parse()或Double.Parse()可以将字符串快速转换为对应的数值类型。数学运算Math类提供了极其丰富的功能如向上取整 (Math.Ceiling)、向下取整 (Math.Floor)、求幂 (Math.Pow) 和开根号 (Math.Sqrt)。2. 日期与时间 (DateTime)获取当前时间DateTime.Now。时间推移AddYears(3)可以轻松将时间往后推 3 年同理还有AddDays()、AddMonths()等。时间差计算两个DateTime对象可以直接相减返回一个TimeSpan对象轻松算出两个日期之间相隔多久。三、 代码的护城河异常处理 (Exception)程序在运行中难免遇到格式错误FormatException或数组越界IndexOutOfRangeException。良好的异常处理能让程序更加健壮。1.try-catch-finally机制try存放可能报错的代码。catch捕获特定类型的异常可以通过ex.Message获取异常信息或通过ex.StackTrace查看堆栈追踪。finally无论是否发生异常都会执行的代码块通常用于关闭流或释放数据库连接。2. 自定义异常如果内置异常不够用我们可以继承Exception类来编写自定义异常。例如在定义Student类时可以通过属性的set访问器校验年龄C#//自定义异常 //继承父类 //创建子类构造调用父类构造 internal class AgeException : Exception { public AgeException() : base() { } public AgeException(int age) : base(年龄不合法 age) { } } internal class Student { //抛出异常 throw private int age; public int Age { get { return age; } set { if (value 0 || value 120) { throw new AgeException(value); } age value; } } }四、 核心数据结构与泛型集合告别了传统的对象数组泛型 (T) 和集合类极大地提升了 C# 的开发效率与类型安全性。1. 列表 (List)ArrayList时代的眼泪早期提供的不定长集合允许存放任何object类型缺点是会发生装箱/拆箱影响性能且缺乏类型安全。ListT现代开发标配底层基于数组实现允许元素重复且有序。初始化时默认容量为 4后续按 2 的倍数自动扩容。支持Add()、AddRange()添加元素。支持通过索引器[i]直接访问或修改。支持 Lambda 表达式进行复杂删除如RemoveAll(x x c#)。2. 链表 (LinkedListT)底层是双向链表由一个个包含prev前驱、next后继和value值的节点 (NodeT) 组成。优势在首尾或已知节点位置插入、删除元素非常快不需要像数组那样移动大量内存。常用方法AddFirst()、AddLast()、Find()、RemoveFirst()。3. 字典 (DictionaryK, V)存储键值对的无序集合。特点Key必须唯一不允许重复Value可以重复。操作通过Add(key, value)添加通过dict[key] newValue快速修改。可以使用foreach分别遍历Keys、Values或整个KeyValuePair。4. 集合 (HashSetT)无序且不重复的集合。非常适合用于需要快速去重或判断元素是否存在的场景。5. 栈 (StackT) 与 队列 (QueueT)栈 (Stack)先进后出 (LIFO)。就像叠盘子最后放上去的盘子最先被拿走。核心方法Push()(压栈)、Peek()(查看栈顶元素不移除)。队列 (Queue)先进先出 (FIFO)。就像排队买票先排队的人先买到票。核心方法Enqueue()(入队)。 结语从最基础的字符串操作到撑起复杂业务逻辑的各种数据结构C# 提供了极为完善的基础类库。理解它们的底层原理如String的不可变性、List的扩容机制不仅能让我们写出能跑的代码更能写出高效、优雅的代码。