C#易错点解析
一、基础语法类易错点
1. 值类型与引用类型混淆(最高频)
错误示例:
csharp
运行
// 错误认知:修改方法内的参数会影响外部变量
void UpdateValue(int num)
{
num = 100; // 值类型是值传递,仅修改副本
}
int a = 10;
UpdateValue(a);
Console.WriteLine(a); // 输出:10(而非100)
原因:
int、bool、struct等值类型默认按值传递,方法内修改的是副本;而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 类:
- 基础层:值类型 / 引用类型传递规则、空引用判断、变量作用域;
- 面向对象层:虚方法重写、非托管资源释放;
- 集合层:遍历中修改集合、枚举器特性。

浙公网安备 33010602011771号