本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助。
1. 开发过程
开发过程是错误和缺陷开始的地方。使用工具可以帮助你在发布之后,解决掉一些问题。
编码标准
遵照编码标准可以编写出更多可维护的代码,特别是在由多个开发人员或团队编写和维护的代码库中。例如FxCop,StyleCop和ReSharper等,就是常用的实施编码标准的工具。
开发人员:在压缩代码之前,请使用工具仔细检查是否违反了标准,并且对结果进行分析。使用工具发现的代码路径问题,不比你预期的少。
代码审查
代码审查和结对编程是任务开发人员审查他人编写的源代码的常见做法。通过这些方式希望能够检查出作者的错误,如编码错误或实现错误。
代码审查是一个很有价值的做法,但是它依赖于人类,易犯错误,所以很难扩展。
静态分析
静态分析工具会在不运行代码的情况下分析代码,在不需要编写测试用例的情况下,查找违反编码标准或存在缺陷的问题。它们能有效地找到问题,但你需要选择出那些能够定位出有价值问题的工具,找出有价值的问题。C#静态分析工具包括Coverity,CAT.NET和Visual Studio代码分析。
动态分析
动态分析工具在运行时分析代码,帮助你查找缺陷,如安全漏洞,性能和并发问题。它分析运行时环境的上下文中的代码,因此其有效性受测试工作负载的限制。Visual Studio提供了一些动态分析工具,包括并发可视化器,IntelliTrace和分析工具。
管理人员/团队领导:利用开发最佳实践,以避免常见的陷阱。仔细考虑可用的工具,以确保它们与你的需求和文化兼容。
测试
有许多类型的测试,例如:单元测试,系统集成测试,性能测试,渗透测试。在开发阶段,大多数测试由开发人员或测试人员编写,以验证应用程序是否满足其要求。
测试仅在它们运行正确的代码时有效。在实现功能和测试的同时,保持开发速度是具有挑战性的。
开发最佳实践
投入时间来识别和配置工具,以便找到你关心的代码问题,无需为开发人员带来更多的工作。经常自动运行分析工具和测试,以确保开发人员在代码刚写完不久,就能定位到问题。
尽快地定位到所有的诊断输出 - 无论是编译器警告,标准违例,通过静态分析识别的缺陷,还是测试失败。如果新的诊断全部是可忽略的,那么审查所起的作用就增加了,开发人员也不必再为代码问题烦恼。
采用这些最佳实践有助于提高代码的质量,安全性和可维护性,开发人员的一致性和生产力以及发布的可预测性。
关心 | 工具 | 影响 |
一致性,可维护性 | 编码标准,静态分析,代码审查 | 一致的间距,命名和格式化提高了可读性,并使开发人员更容易编写和维护代码。 |
正确性 | 代码审查,静态分析,动态分析,测试 | 代码不仅需要在语法上有效,而且必须按照开发人员的意图并满足项目需求。 |
功能 | 测试 | 测试验证代码是否满足要求,如正确性,可扩展性,鲁棒性和安全性。 |
安全 | 编码标准,代码审查,静态分析,动态分析,测试 | 安全是一个非常复杂的问题; 任何弱点或缺陷都可能被利用。 |
开发人员生产力 | 编码标准,静态分析,测试 | 当他们有工具来识别错误时,开发人员更快地实现代码更改。 |
释放可预测性 | 编码标准,代码审查,静态分析,动态分析,测试 | 简化后期活动,尽早解决缺陷和问题,尽可能缩短修复周期。 |
2. 类型陷阱
C#的一个主要优势是其灵活的类型系统; 类型安全有助于早期发现错误。通过强制实施严格的类型规则,编译器能够帮助你保持正确的编码实践。C#语言和.NET框架提供了丰富的类型集合以适应最常见的需求。大多数开发人员很好地了解常见的类型及其用途,但有一些常见的误解和误用。
有关.NET Framework类库的更多信息可以在MSDN库中找到。
了解和使用标准接口
某些接口涉及常用的C#特性。例如,IDisposable允许使用常用的资源处理习语,例如“using”关键字。理解什么时候使用接口,能够使你编写更容易维护的C#代码。
避免ICloneable - 设计者从来没有明确拷贝的对象是深拷贝还是浅拷贝。由于没有正确拷贝对象行为的标准,也就无法有效的使用这样的接口。
结构
尽量避免写到结构体。将它们视为不可变的,能够防止混淆的发生,并且在共享内存的场景(如多线程应用程序)下更安全。相反,在创建结构体时使用初始化对象,如果需要更改值,则创建新的实例。
要了解哪些标准类型/方法是不可变的并返回新值(例如,string,DateTime)和哪些是可变的(List.Enumerator)。
字符串
字符串可以为null,因此在适当时,使用起来很方便。等价(s.Length == 0)可能会抛出一个NullReferenceException,但是String.IsNullOrEmpty(s)和String.IsNullOrWhitespace(s)函数能够优雅地处理null。
标记枚举
枚举类型和常量值是能表露出自己含义的标识符,用于替换魔术数字,以便使得代码更加可读。
如果你发现需要创建枚举的集合,标记枚举可能是一个更简单的选择:
>
<
<
<
><