news 2026/4/23 17:07:07

C#易错点解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#易错点解析

一、基础语法类易错点

1. 值类型与引用类型混淆(最高频)

错误示例

csharp

运行

// 错误认知:修改方法内的参数会影响外部变量 void UpdateValue(int num) { num = 100; // 值类型是值传递,仅修改副本 } int a = 10; UpdateValue(a); Console.WriteLine(a); // 输出:10(而非100)

原因intboolstruct等值类型默认按值传递,方法内修改的是副本;而class、数组、委托等引用类型按引用传递,修改对象属性会影响原对象。正确做法:值类型需用ref/out关键字实现引用传递:

csharp

运行

void UpdateValue(ref int num) { num = 100; } UpdateValue(ref a); Console.WriteLine(a); // 输出:100
2. 空引用异常(NullReferenceException)

错误示例

csharp

运行

string str = null; // 直接调用null对象的方法/属性,触发空引用异常 Console.WriteLine(str.Length);

原因:未判断对象是否为null就访问其成员,是 C# 最常见的运行时错误。正确做法:使用空合并运算符??、空条件运算符?.

csharp

运行

// 安全访问:str为null时返回0,避免异常 int length = str?.Length ?? 0; Console.WriteLine(length); // 输出:0
3. 变量作用域与生命周期错误

错误示例

csharp

运行

if (true) { int temp = 5; // 局部变量仅在if块内有效 } Console.WriteLine(temp); // 编译报错:temp不存在

原因:变量的作用域由声明位置决定(如代码块、方法、类),超出作用域无法访问。正确做法:在需要使用的最小范围外声明变量:

csharp

运行

int temp = 0; if (true) { temp = 5; } Console.WriteLine(temp); // 输出:5

二、面向对象类易错点

1. 继承与虚方法 / 重写混淆

错误示例

csharp

运行

class Parent { public void Show() { Console.WriteLine("Parent"); } } class Child : Parent { public void Show() { Console.WriteLine("Child"); } // 仅隐藏父类方法,非重写 } Parent obj = new Child(); obj.Show(); // 输出:Parent(而非Child)

原因:未用virtual(父类)+override(子类)标记,子类方法仅 “隐藏” 父类,而非真正重写。正确做法

csharp

运行

class Parent { public virtual void Show() { Console.WriteLine("Parent"); } } class Child : Parent { public override void Show() { Console.WriteLine("Child"); } } Parent obj = new Child(); obj.Show(); // 输出:Child
2. 未释放非托管资源(内存泄漏)

错误示例

csharp

运行

// FileStream是实现IDisposable的非托管资源,未释放会占用内存 FileStream fs = new FileStream("test.txt", FileMode.Open); // 未调用fs.Close()或fs.Dispose()

原因:文件流、数据库连接、网络套接字等非托管资源不会被 GC 自动回收,未释放会导致内存泄漏。正确做法:使用using语句自动释放:

csharp

运行

using (FileStream fs = new FileStream("test.txt", FileMode.Open)) { // 操作文件 } // 代码块结束自动调用Dispose()释放资源

三、集合与泛型类易错点

1. 遍历集合时修改集合

错误示例

csharp

运行

List<int> list = new List<int> { 1, 2, 3 }; foreach (int num in list) { if (num == 2) { list.Remove(num); // 编译通过,运行时报错:集合已修改 } }

原因foreach遍历依赖枚举器,遍历过程中修改集合(增 / 删)会破坏枚举器状态。正确做法:遍历副本或用for循环倒序删除:

csharp

运行

// 方法1:遍历副本 foreach (int num in list.ToList()) { if (num == 2) list.Remove(num); } // 方法2:for倒序删除 for (int i = list.Count - 1; i >= 0; i--) { if (list[i] == 2) list.RemoveAt(i); }

总结

C# 核心易错点可归纳为 3 类:

  1. 基础层:值类型 / 引用类型传递规则、空引用判断、变量作用域;
  2. 面向对象层:虚方法重写、非托管资源释放;
  3. 集合层:遍历中修改集合、枚举器特性。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:24:51

重要内容表述

凡早也是要办&#xff0c;晚也是要办&#xff0c;一定要早办&#xff1b;凡主动也是办&#xff0c;被动也是办&#xff0c;力争主动办&#xff1b;凡也可以去办&#xff0c;也可以不办&#xff0c;尽可能地办&#xff1b;凡冷淡也是办&#xff0c;热情也是办&#xff0c;要热情…

作者头像 李华
网站建设 2026/4/23 12:30:15

Java毕设选题推荐:基于springboot的传媒公司传媒直播管理系统设计与实现主播资源管理,签约信息、档期安排【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/23 12:29:28

RAG工程实践必看:一文掌握元数据打标,解决检索“大海捞针“难题,精准度提升200%

本文聚焦RAG工程化中的检索精准度瓶颈&#xff0c;提出通过知识打标与元数据维护提升检索效率。详述元数据筛选语义匹配的双阶段检索逻辑&#xff0c;分析文档级与分块级标签的粒度选择与继承机制&#xff0c;并介绍从人工打标到LLM智能打标的工程实践路径。最后提出三种解决无…

作者头像 李华