时间:2017-9-14来源:本站原创作者:佚名

本文讲述了C#开发人员应该了解到的3件事情,希望对c#开发人员有所帮助。

.开发过程

开发过程是错误和缺陷开始的地方。使用工具可以帮助你在发布之后,解决掉一些问题。

编码标准

遵照编码标准可以编写出更多可维护的代码,特别是在由多个开发人员或团队编写和维护的代码库中。例如FxCop,StyleCop和ReSharper等,就是常用的实施编码标准的工具。

开发人员:在压缩代码之前,请使用工具仔细检查是否违反了标准,并且对结果进行分析。使用工具发现的代码路径问题,不比你预期的少。

代码审查

代码审查和结对编程是任务开发人员审查他人编写的源代码的常见做法。通过这些方式希望能够检查出作者的错误,如编码错误或实现错误。

代码审查是一个很有价值的做法,但是它依赖于人类,易犯错误,所以很难扩展。

静态分析

静态分析工具会在不运行代码的情况下分析代码,在不需要编写测试用例的情况下,查找违反编码标准或存在缺陷的问题。它们能有效地找到问题,但你需要选择出那些能够定位出有价值问题的工具,找出有价值的问题。C#静态分析工具包括Coverity,CAT.NET和VisualStudio代码分析。

动态分析

动态分析工具在运行时分析代码,帮助你查找缺陷,如安全漏洞,性能和并发问题。它分析运行时环境的上下文中的代码,因此其有效性受测试工作负载的限制。VisualStudio提供了一些动态分析工具,包括并发可视化器,IntelliTrace和分析工具。

管理人员/团队领导:利用开发最佳实践,以避免常见的陷阱。仔细考虑可用的工具,以确保它们与你的需求和文化兼容。

测试

有许多类型的测试,例如:单元测试,系统集成测试,性能测试,渗透测试。在开发阶段,大多数测试由开发人员或测试人员编写,以验证应用程序是否满足其要求。

测试仅在它们运行正确的代码时有效。在实现功能和测试的同时,保持开发速度是具有挑战性的。

开发最佳实践

投入时间来识别和配置工具,以便找到你关心的代码问题,无需为开发人员带来更多的工作。经常自动运行分析工具和测试,以确保开发人员在代码刚写完不久,就能定位到问题。

尽快地定位到所有的诊断输出-无论是编译器警告,标准违例,通过静态分析识别的缺陷,还是测试失败。如果新的诊断全部是可忽略的,那么审查所起的作用就增加了,开发人员也不必再为代码问题烦恼。

采用这些最佳实践有助于提高代码的质量,安全性和可维护性,开发人员的一致性和生产力以及发布的可预测性。

关心工具影响一致性,可维护性编码标准,静态分析,代码审查一致的间距,命名和格式化提高了可读性,并使开发人员更容易编写和维护代码。正确性代码审查,静态分析,动态分析,测试代码不仅需要在语法上有效,而且必须按照开发人员的意图并满足项目需求。功能测试测试验证代码是否满足要求,如正确性,可扩展性,鲁棒性和安全性。安全编码标准,代码审查,静态分析,动态分析,测试安全是一个非常复杂的问题;任何弱点或缺陷都可能被利用。开发人员生产力编码标准,静态分析,测试当他们有工具来识别错误时,开发人员更快地实现代码更改。释放可预测性编码标准,代码审查,静态分析,动态分析,测试简化后期活动,尽早解决缺陷和问题,尽可能缩短修复周期。2.类型陷阱

C#的一个主要优势是其灵活的类型系统;类型安全有助于早期发现错误。通过强制实施严格的类型规则,编译器能够帮助你保持正确的编码实践。C#语言和.NET框架提供了丰富的类型集合以适应最常见的需求。大多数开发人员很好地了解常见的类型及其用途,但有一些常见的误解和误用。

有关.NETFramework类库的更多信息可以在MSDN库中找到。

了解和使用标准接口

某些接口涉及常用的C#特性。例如,IDisposable允许使用常用的资源处理习语,例如“using”关键字。理解什么时候使用接口,能够使你编写更容易维护的C#代码。

避免ICloneable-设计者从来没有明确拷贝的对象是深拷贝还是浅拷贝。由于没有正确拷贝对象行为的标准,也就无法有效的使用这样的接口。

结构

尽量避免写到结构体。将它们视为不可变的,能够防止混淆的发生,并且在共享内存的场景(如多线程应用程序)下更安全。相反,在创建结构体时使用初始化对象,如果需要更改值,则创建新的实例。

要了解哪些标准类型/方法是不可变的并返回新值(例如,string,DateTime)和哪些是可变的(List.Enumerator)。

字符串

字符串可以为null,因此在适当时,使用起来很方便。等价(s.Length==0)可能会抛出一个NullRefenceException,但是String.IsNullOrEmpty(s)和String.IsNullOrWhitespace(s)函数能够优雅地处理null。

标记枚举

枚举类型和常量值是能表露出自己含义的标识符,用于替换魔术数字,以便使得代码更加可读。

如果你发现需要创建枚举的集合,标记枚举可能是一个更简单的选择:

[Flag]publicenumTag{None=0x0,Tip=0x,Example=0x2}

这使你能够轻松地为代码段添加多个标签:

snippet.Tag=Tag.Tip

Tag.Example

这可以改善数据封装,因为你不必担心通过Tagpropertygetter暴露内部集合。

等价比较

有两种类型的等价:

引用相等,这意味着两个引用,引用了同一个对象。

值平等,这意味着两个不同的对象是等值的。

此外,C#提供了多种方法来测试等价。最常见的方法是使用:

==和!=运算符

继承自Object的虚拟Equals方法

静态Object.Equals方法

IEquatable接口的Equals方法

静态Object.RefenceEquals方法

可能难以知道预期的是引用相等还是值相等。如果你重写Equals,不要忘记IEquatableT,GetHashCode(),如MSDN中所述。

注意无类型容器对重载的影响。考虑比较“myArrayList[0]==myString”。数组列表元素是编译时类型“对象”,因此使用引用等价。C#编译器会警告你这个潜在错误,但是有许多类似的情况,编译器不会对意外的引用相等发出警告。

3.类陷阱

封装你的数据

类负责正确地管理数据。出于性能原因,它们通常缓存部分结果或者对其内部数据的一致性做出假设。数据公开访问会影响你缓存或做出假设的能力,对性能,安全性和并发性都有潜在影响。例如,暴露可变成员,如通用集合和数组,允许用户在你不知情的情况下修改这些结构。

属性

属性使你能够精确控制用户如何与你的对象进行交互,除了你通过访问修改器控制的之外。具体来说,属性使你能够控制读取和写入时发生的情况。

属性使你能够建立稳定的API,同时重写getter和setter中的数据访问逻辑,或提供数据绑定源。

不要也不要让属性获取器抛出异常,避免修改对象状态。这样就意味着需要一种方法而不是属性获取器。

有关属性的详细信息,请参阅MSDN的属性设计主题:







































鐧界櫆椋庢棭鏈熷彂鐥呭師鍥?
鐧界櫆椋庡彲浠ユ不寰楀ソ鍚?

转载请注明原文网址:http://www.helimiaopu.com/hjpz/hjpz/5459.html

------分隔线----------------------------