C# 初学者常见错误大全:从 A 到 Z

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C# 初学者常见错误大全:从 A 到 Z

\n\n

转向 C# 和 .NET 平台是一段激动人心的旅程。然而,就像任何语言一样,初学者常常会踩到同样的坑。其中一些错误会导致难以发现的 bug,另一些则会导致性能下降。在本文中,我们将剖析 C# 初学者最常见的错误,从类型误用到异步问题。了解这些陷阱将帮助您编写更干净、更安全、更高效的代码。

\n\n

1. 忽略 NullReferenceException 且缺乏检查

\n\n

这可能是每个新手都会遇到的最常见错误。您对一个实际为 null 的对象调用方法或属性,应用程序就会因 NullReferenceException 而崩溃。

\n\n

问题: 开发者假设方法总是返回一个对象,或者没有检查调用结果。

\n\n

错误代码示例:

\n
public string GetCustomerName(int id)\n{\n    var customer = _repository.FindById(id);\n    // 如果 customer == null,下一行将崩溃\n    return customer.FullName.ToUpper();\n}
\n\n

如何修复: 使用条件运算符或 ? 运算符(null-条件运算符)。

\n
public string GetCustomerName(int id)\n{\n    var customer = _repository.FindById(id);\n    // 安全调用:如果 customer 为 null,则返回 null\n    return customer?.FullName?.ToUpper() ?? "未知客户";\n}
\n\n

建议: 在 C# 8.0 及以上版本中,使用 可为空引用类型。这将允许编译器在编译阶段警告您潜在的 null 值。

\n\n

2. 值类型与引用类型(ref/out)的混淆

\n\n

许多新手不理解按值传递和按引用传递的区别。特别是关于 ref 和 out 修饰符。

\n\n

问题: 您认为将对象传递给方法会修改原始变量,但情况并非总是如此。如果您为参数分配一个新对象,原始变量不会改变(除非使用 ref)。

\n\n

示例:

\n
public void ChangeName(string name)\n{\n    name = "新名称"; // 这不会改变原始变量!\n}\n\nstring myName = "旧名称";\nChangeName(myName);\nConsole.WriteLine(myName); // 输出:"旧名称"
\n\n

如何修复: 如果确实需要更改引用,请使用 ref 或 out。

\n
public void ChangeName(ref string name)\n{\n    name = "新名称";\n}\n\nstring myName = "旧名称";\nChangeName(ref myName);\nConsole.WriteLine(myName); // 输出:"新名称"
\n\n

重要提示: 当方法必须在退出前为参数赋值时,使用 out。当变量在调用前已初始化时,使用 ref。

\n\n

3. LINQ 的误用(多次枚举)

\n\n

LINQ 是一个强大的工具,但如果您不了解延迟执行的工作原理,它可能会严重影响性能。

\n\n

问题: 调用 .Where() 或 .Select() 不会立即执行查询。每次您枚举结果时(例如在 foreach 循环中),查询都会重新执行。

\n\n

错误代码示例:

\n
var numbers = Enumerable.Range(1, 1000);\nvar filtered = numbers.Where(n => n % 2 == 0);\n\n// 第一次遍历——查询执行\nint count = filtered.Count();\n\n// 第二次遍历——查询再次执行\nforeach (var num in filtered)\n{\n    Console.WriteLine(num);\n}
\n\n

如何修复: 物化

博客

书籍推荐