5 个会让你的 C# 代码变得混乱的坏习惯——以及如何避免它们
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
如何判断你在使用 C# 编程时是否遵循了良好的编程实践?又该如何避免那些会让代码变得混乱且难以维护的不良实践?本文将探讨五种常见的不良实践,并解释如何通过一些更优的替代方案来避免它们。
停止使用 if 语句检查空值
这if条语句用途广泛,其中之一是用来进行检查null。虽然这种表述方式也正确,但还可以更简洁一些:
糟糕的方式:
if (application != null)
{
if (application.protected != null)
{
return application.protected.shieldLastRun;
}
}
好方法:
return application?.protected?.shieldLastRun;
我从未说过你不能使用 if 语句进行空值检查,但是通过设置空值条件(这正是该功能实现的目的),我们可以获得更简洁、更易读的代码。
📚查看微软文章了解更多信息:空值合并运算符
使用元组代替类
如果你想返回多个结果,首先想到的可能是为此创建一个专门的类。这当然是正确的方法,但并非最佳方法。
糟糕的方式:
public ApplicationInfo GetInfo()
{
var application = new ApplicationInfo
{
Path = "C:/apps/",
Name = "Shield.exe"
};
return application;
}
好方法:
public (string Path, string Name) GetApplicationInfo()
{
return ("C:/apps/", "Shield.exe");
}
为此tuples,根据Mahesh Chand在其文章《C# 中的元组》中的说法:
“我们经常需要从类方法返回多个值。在 .NET 引入元组之前,有三种常见的方法可以做到这一点。”
- 输出参数
- 类或结构类型
- 通过动态返回类型元组返回的匿名类型可以解决这个问题。
正如 Mahesh Chand 所说,元组可以解决这个问题。因此,使用元组比创建新类要好得多。
📚查看微软文章了解更多信息:C# 中的元组类型
避免使用私人成员进行修改
允许修改成员并非良好做法。您必须谨慎决定哪些成员可以修改,哪些成员不可以。
糟糕的方式:
class Laptop
{
public string Os{ get; set; } // can be modified
public Laptop(string os)
{
Os= os;
}
}
var laptop = new Laptop("macOs");
Console.WriteLine(Laptop.Os); // Laptop os: macOs
好方法:
class Laptop
{
public string Os{ get; } // cannot be modified
public Laptop(string os)
{
OS = os;
}
}
var laptop = new Laptop("macOs");
Console.WriteLine(Laptop.Os); // Laptop os: macOs
如果成员不会被修改,最好不要使用, set;以避免将来发生任何意外(或故意)修改。
📚查看微软文章了解更多信息:获取和设置访问器
使用条件运算符代替 if-else 语句。
我们常常出于习惯,只使用传统的方式if-else,仅此而已。我并不想把这看作是一种不好的做法,但确实有更好的方法:
糟糕的方式:
if (hasApplication)
{
shouldProtect = true;
}
else
{
shouldProtect = false;
}
好方法:
bool shouldProtect = hasApplication ? true: false;
我们可以清楚地看到,虽然它与 类似if-else,但通过使用三元条件运算符 ?:,它更容易阅读和理解,并且我们将得到更简洁的代码。
📚查看微软文章了解更多信息:条件运算符
避免使用首字母缩写作为标识符缩写
谈到编写整洁代码,人们首先想到的可能就是使用首字母缩写来缩短标识符中的代码。这固然是一种好习惯,但必须谨慎使用。
糟糕的方式:
//different identifiers but same abbreviation
private readonly SecurityManager _sm;
private readonly SoftwareManager _sm;
好方法:
//No confusion
private readonly SecurityManager _securityManager;
private readonly SoftwareManager _softwareManager;
如果要使用缩写,请务必三思,以免日后造成混淆。很多时候,简单并不等于最佳。
📚请查看微软文章系列了解更多信息:命名指南
文章来源:https://dev.to/bytehide/5-bad-practices-that-can-make-your-c-code-messy-and-how-to-avoid-them-3p0f