引言:为什么错误是正常的
每个开发者的成长之路都始于错误。C# (.NET) 是一种功能强大且强类型的语言,对错误的容忍度低于动态语言,但作为回报,它提供了可靠性和高性能。本文将剖析初学者最容易遇到的4个常见陷阱,并展示如何避免它们。无论你是刚开始学习C#,还是想巩固已有知识,这篇文章都将对你有所帮助。
1. 忽略null和NullReferenceException
C#中最常见的错误是 NullReferenceException。当你尝试访问一个 null 对象的成员时,就会发生此错误。
问题示例
string text = null;int length = text.Length; // 错误!NullReferenceException初学者经常忘记检查方法返回的值,或者错误地认为某个对象一定存在。
正确做法
- 在使用对象之前,始终检查对象是否为
null。 - 使用
?.(空条件运算符)和??(空合并运算符)。
string text = GetText(); // 可能返回 nullint? length = text?.Length; // 如果 text == null,则 length 为 nullint safeLength = text?.Length ?? 0; // 如果为 null,则返回 0Console.WriteLine(safeLength);此外,在 C# 8.0+ 中,引入了可为空引用类型,可通过 #nullable enable 启用。它强制你明确指定变量是否可以为 null,并在编译时警告潜在问题。
2. 滥用var导致可读性下降
var 关键字允许编译器自行推断变量的类型。这很方便,但初学者常常过度使用它,导致代码可读性变差。
糟糕代码示例
var data = GetData();var result = Process(data);var output = Transform(result); // 什么类型?不明确。一个月后,你(或你的同事)不查看方法定义,就无法快速理解 data 的类型。
何时使用var
- 当从右侧表达式可以明显看出类型时(例如
var list = new List<int>();) - 处理匿名类型和 LINQ 查询时。
// 好的用法:类型显而易见var numbers = new List<int> { 1, 2, 3 };
// 好的用法:匿名类型var person = new { Name = "John", Age = 30 };
// 坏的用法:类型不明确var config = LoadConfiguration(); // 更好:Configuration config = LoadConfiguration();黄金法则:仅在能提升可读性时使用 var,而非降低可读性时。
3. 吞没异常和空的catch块
许多初学者在遇到异常时,会写一个空的 catch 块或仅输出一条消息而不分析错误。这会使程序不稳定并增加调试难度。
反模式示例
try{ int.Parse("not a number");}catch (Exception){ // 不做任何处理——错误被"吞没"了}应用程序会继续运行,但处于错误状态。用户不会知道问题所在,数据也可能被损坏。
正确处理异常的方法
- 除非你打算处理所有类型的错误,否则不要捕获通用的
Exception。 - 只捕获你能处理的异常(例如
FormatException、FileNotFoundException)。 - 使用
finally释放资源(文件、连接)。 - 记录错误日志。
try{ int number = int.Parse(userInput);}catch (FormatException ex){ // 记录日志并通知用户}