当前位置: 首页 > news >正文

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. 集合层:遍历中修改集合、枚举器特性。
http://www.gsyq.cn/news/143364.html

相关文章:

  • 创新!高级!【日前、日内非滚动、日内滚动调度以及实时修正】考虑需求侧响应的智慧楼宇多时间尺度调度策略附Matlab代码
  • 【Linux】Linux使用笔记
  • 大模型打分机制揭秘:为何需要多次更换位置进行评分?
  • 中望3D2026曲面建模技巧:利用「缠绕到面」功能将平面特征精准移植到曲面
  • SRC 漏洞挖掘全流程攻略:小白→挖洞达人,学习路线 + 配套工具全曝光
  • 基于微信小程序的零工市场服务系统计算机毕业设计项目源码文档
  • vscode使用vs环境运行程序
  • java基础-HashMap
  • 【Unity】各种操作触发GC情况
  • 2026金三银四必备国内大厂Java面试高频题库整理!
  • Mercado Libre(美客多)拉美市场研究指南:十款实用工具助力跨境运营分析
  • 茶颜悦色X北森|如何用AI面试官帮HR工作量直降90%!
  • 【负荷预测】基于变分模态分解(VMD-CNN-LSTM)的短期电力负荷预测Python代码
  • 【技术美术】TRS矩阵
  • 最大数max(x,y,z)(信息学奥赛一本通- P1152)
  • 基于Spring框架社区老年人健康杂志阅读分享管理系统
  • 2025年珠海可靠的门窗源头厂家有哪些,门窗/慕莎尼奥门窗/断桥铝门窗/侧压平移推拉窗/铝门窗/安全门窗实力厂家推荐排行榜 - 品牌推荐师
  • 【软件开发】Windows 开发笔记
  • DDD领域驱动设计原理
  • 量子优越性为什么采用玻色采样问题,而不采用N皇后问题呢?
  • 【技术美术】视差贴图
  • 详细介绍:Sciter之c++与前端交互(五)
  • 【技术美术】双向反射分布函数
  • 软件缺少找不到MSJT4JLT.DLL文件 下载修复方法
  • 打造个人数字大脑:访答知识库深度指南
  • 收藏!程序员避坑指南:裁员潮下,入局大模型才是高薪破局关键
  • Python入门笔记【持续加工中】
  • 【技术美术】不同物体的渲染处理
  • 【收藏】大模型学习全指南:从零基础入门到实战精通,程序员必备成长路径
  • 蓝桥杯c语言学习——背包问题