跳至页脚内容
Iron Academy Logo
学习 C#
学习 C#

其他类别

简化 C# 代码的 14 种方法--Tim Corey 视频中关于 C# 最佳实践的见解

Tim Corey
44m 57s

在蒂姆·科里 (Tim Corey) 制作的综合视频" 14 种简化 C# 代码的方法"中,他探讨了提高代码可读性、减少混乱并保持代码库可维护性的实用 C# 最佳实践。 Tim 并不沉迷于一行行代码或晦涩难懂的技巧,而是专注于良好的编码实践——如何编写其他开发人员可以遵循的简洁、易懂的代码。

他以 Visual Studio 中的真实示例为框架来讲解每个技巧,涉及命名约定、错误处理,甚至如何在不破坏现有功能的情况下重构代码。 这不仅仅是理论——实践才能真正提升代码质量。

在本文中,我们将逐一介绍他所展示的 14 种方法。

1. 使用静态 using 语句可以编写更简洁的代码

Tim 首先展示了静态访问如何简化重复调用。 通过声明:

using static System.Console;
using static System.Console;

您不再需要在每个静态成员前加上 Console 前缀。

这不仅仅是删除文字——而是要明确静态访问方式。 Tim 指出,如果你要调用在常用类(如 Console 或 Math)中定义的静态成员,这种简写方式可以提高代码的可读性。

然而,作为良好编码实践的一部分,他警告开发人员应该避免冲突——两个不同的类可能对静态成员使用相同的名称。 意识到可能出现的意外行为至关重要。

2. 使用以下方式初始化列表

C# 现在允许你更直接地初始化列表:

List<string> names = ["Tim", "Sue", "Bilbo"];
List<string> names = ["Tim", "Sue", "Bilbo"];

Tim 解释说,这并不是要把所有内容都塞进一个语句里——而是要编写更易于阅读的代码,并通过减少繁琐的步骤来优化性能。

读者无需解析"新的字符串列表"样板代码,而是可以直接看到真正重要的东西:集合中的描述性名称。 Tim 还指出,这种方法也适用于数组甚至字典,符合以清晰性为优先的编码规范。

3. 目标类型新

另一个省时方法:目标类型新建。 而不是:

List<int> numbers = new List<int>();
List<int> numbers = new List<int>();

你可以写:

List<int> numbers = new();
List<int> numbers = new();

Tim 指出,重复类名是不必要的——它已经在左侧了。这符合良好的编码实践,既消除了冗余,又使代码库更易于阅读。

4. var 和匿名类型

Tim 探讨了 var 特性,该特性在编码实践圈内引发了争论。 有些人不喜欢它,因为它隐藏了变量名和类型,但 Tim 澄清说,它的真正力量在于匿名类型。

在使用数据源(例如通过 Dapper 使用 SQL)时,Tim 展示了如何使用 var 函数动态创建对象:

var parameters = new { FirstName = "Tim", LastName = "Corey" };
var parameters = new { FirstName = "Tim", LastName = "Corey" };

这非常适合写入查询或一次性对象——您无需仅仅为了参数而创建基类。 正如 Tim 所说,这样可以避免用不必要的类型污染你的代码库,同时在出现问题时还能提供有意义的错误消息。

5. 文件作用域命名空间

Tim 转向文件作用域命名空间,并展示了如何实现这一点:

namespace ProjectName
{
    // indented code
}
namespace ProjectName
{
    // indented code
}

变成这样:

namespace ProjectName;
namespace ProjectName;

这一小小的改动消除了不必要的缩进,并遵循了 C# 命名约定,例如公共成员的 Pascal 命名法。 Tim解释说,由于大多数文件只包含一个命名空间,这提高了代码的可读性,并保持了逻辑部分的对齐。

6. 单行数据结构的记录

使用记录功能,您只需一条语句即可定义数据对象:

public record EmployeeRecord(int Id, string Name);
public record EmployeeRecord(int Id, string Name);

Tim 指出,这样只需付出最小的努力就能生成一个完整的类型——属性、不可变性和 ToString() 方法。 他明确表示,派生类场景仍然需要类,但当对象是只读时,记录遵循单一职责原则,做好一件事。

7. 模式匹配

Tim 演示了模式匹配如何帮助你处理异常情况并安全地进行比较。 与其编写冗长的类型检查,不如将它们合并起来:

if (emp is EmployeeRecord e)
{
    e.Id = 1;
}
if (emp is EmployeeRecord e)
{
    e.Id = 1;
}

这一行代码负责检查和转换。 Tim 说这符合良好的编码实践——避免使用像 x 或 y 这样的单字母变量名,而是使用像 e 这样的描述性名称。 清晰的方法名和变量名使其他开发人员更容易维护代码。

8. 字符串插值

为了构建易读的字符串,Tim 演示了字符串插值:

$"The employee with ID {e.Id} is {e.Name}"
$"The employee with ID {e.Id} is {e.Name}"

他指出,这样可以更轻松地显示有意义的错误信息并编写注释。 与其使用混乱的代码拼接,不如编写像英语一样易读的代码——提高代码质量,简化未来检查输出的单元测试。

9. 使用 nameof() 进行安全重构

Tim 展示了 nameof() 如何在重构代码时保护你。 字符串中硬编码的变量名如果被重命名,可能会导致意想不到的行为。 但通过写作:

nameof(emp)
nameof(emp)

编译器会自动更新每次使用情况。 这是保持代码库健康的最佳实践之一,它能帮助你编写简洁且结构清晰的代码。

10. 用于多个返回值的元组

Tim 没有创建一个仅仅为了返回两个值而创建的基类,而是使用了元组:

(string FirstName, string LastName) SplitName(string fullName)
(string FirstName, string LastName) SplitName(string fullName)

这样就避免了不必要的外部依赖,并且遵循单一职责原则——该方法只是拆分一个名称,仅此而已。 正如蒂姆所说,避免过度设计,练习才能写出更好的代码。

11. 解构

Tim 在元组的基础上,展示了如何将结果分解为局部变量:

var (firstName, lastName) = SplitName("Tim Corey");
var (firstName, lastName) = SplitName("Tim Corey");

这样可以保持变量名称的描述性,并避免以后出现晦涩难懂的元组语法。 Tim 甚至还提到了丢弃未使用的值(使用 _),这表明了意图——没有一个单字母变量名没有得到解释。

12. 丢弃不需要的值

如果不需要元组的所有部分,Tim 建议丢弃它们:

var (firstName, _) = SplitName("Tim Corey");
var (firstName, _) = SplitName("Tim Corey");

这表明其他开发人员您有意忽略某个值——这对于测试框架或单元测试非常有用,因为并非所有输出都重要。

13. 不使用代码块的 using 语句

蒂姆转岗到资源管理和错误处理部门。 以前你会这样写:

using (var connection = new SqlConnection(connString))
{
    // work
}
using (var connection = new SqlConnection(connString))
{
    // work
}

现在,您可以使用:

using var connection = new SqlConnection(connString);
using var connection = new SqlConnection(connString);

这符合 SOLID 原则——特别是单一职责原则和依赖倒置原则。 Tim 指出,这种语法对于数据库等外部依赖项非常有效,确保大多数异常处理更加清晰,并且连接始终关闭,从而避免性能问题,甚至避免在连接未被释放时出现 SQL 注入场景。

14. 内联变量声明

最后,Tim 讲解了用于解析等操作的内联变量声明:

if (int.TryParse(numberText, out int numberValue))
if (int.TryParse(numberText, out int numberValue))

在这里,您可以在同一行创建局部变量。这有助于保持编码规范的严谨性和方法名称的描述性。通过合理地组织代码,您可以减少意外行为,并使未来的代码重构工作更加安全。

总结

Tim 在视频结尾提醒观众:这些简化不是为了编写晦涩难懂的一行代码,而是为了良好的编码实践。 使用静态记录、模式匹配、元组和丢弃等功能,可以编写简洁、现代的 C# 代码。

他鼓励开发者在采用这些功能时,要考虑命名约定、错误处理和有意义的名称。 "代码是供人阅读的,"蒂姆说——当你编写易于理解的代码时,你不仅能让自己的生活更美好,也能让其他开发人员的生活更美好。

简而言之:遵循这些 C# 最佳实践,遵循 SOLID 原则,例如单一职责原则、接口隔离原则和依赖倒置原则,你的代码不仅可以编译,还能提高性能、减少意外行为,并让你的团队快乐地进行编码。

Hero Worlddot related to 简化 C# 代码的 14 种方法--Tim Corey 视频中关于 C# 最佳实践的见解
Hero Affiliate related to 简化 C# 代码的 14 种方法--Tim Corey 视频中关于 C# 最佳实践的见解

分享您的所爱,赚取更多收入

您为使用 .NET、C#、Java、Python 或 Node.js 的开发人员创建内容吗?将您的专业知识转化为额外收入!

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我