您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 订阅
  捐助
好代码是管出来的——C#的代码规范
 
   次浏览      
 2019-8-26 
 
编辑推荐:
本文来自cnblogs ,文章主要介绍了.net代码规范简介,代码格式规范,代码使用规范,一些常用的代码规范工具。

代码是软件开发过程的产物,代码的作用是通过编译器编译后运行,达到预期的效果(功能、稳定性、安全性等等),而另外一个重要作用是给人阅读。对于机器来说只要代码正确就能够正确的运行程序,但是人不同,如果代码编写混乱就会对代码阅读造成障碍,导致代码无法维护,甚至会导致代码重构等高成本活动,所以规范代码势在必行。

.Net代码规范简介

文章开始提到过代码是给人看的,代码规范的目的在于创建一个统一的规范来保持代码的整洁,这样有利于提高代码的可维护性,但除此之外还可以将一些代码的最佳实践也作为规范的一部分,这样还可以提高代码的性能和安全性。

一般来说.Net的代码规范主要有:代码格式规范、代码使用规范,前者保证代码可读性后者保证代码执行效率和安全性。

代码格式规范

代码格式规范主要的目的是统一代码编写格式,避免开发人员独特的代码编写方式,以便于项目的所有开发人员能快速的阅读其他人员开发的代码,代码格式规范主要有以下几个方面:

注:除以下规范外,对于一个工程来说应该还有工程结构规范(也可以理解为代码目录结构规范),工程结构规范可能因项目不同而不同,但是统一规范可以提高代码查找效率和开发效率(团队新成员不会再疑惑代码应该放哪里)。

命名规范

命名规范主要涉及命名空间、类型、接口、属性、方法、变量等相关命名,其主要规范有:

使用Pascal(单词首字母大写)命名方式对命名空间、类型、枚举类型、枚举值、事件、属性、方法、常量进行命名。

例:public class PersonManager {}

使用Camel()命名方式对参数、变量、字段进行命名。

例:private string userName;

禁止使用缩写,除URL、IO等能达成共识的缩写除外,使用缩写可全大写。

例:System.IO;

接口以I做为前缀进行命名。

例:public interface IConvertor {}

抽象类以Abstract为前缀或者以Base为后缀进行命名。

例:public abstract class PersonBase {}

异常类型以Exception为后缀。

例:public class CustomException {}

在对任何东西命名时需要使用有意义的名称,并且保证单词拼写正确以及语法正确,避免使用拼音(地名等通用拼音除外)。

例: public string Name {get; set;}

反例: public string N {get; set;}

布局规范

布局规范的目的是使代码变得整洁,提高代码可读性,其主要规范有:

代码缩进为4个空格。

左右花括号必须独自一行,括号内容为空时除外:

例:

public void WriteLog(string log)

    {

      Console.WriteLine(log);

    }

    public void EmptyMethod(string log) {}

 

括号的使用:

if/for/while/do等关键字后面与左括号直接需要加空格:

if (x == 1)

运算符左右需要加空格:

a = c + b;

单行代码限制120个字符,超长处理方式:

第二行相对第一行缩进4个空格,从第三行开始无需缩进。

运算符及方法调用的“.”需要跟随换行,但逗号不需要。

例:

WebHost.CreateDefaultBuilder(args)

       .UseStartup<Startup>()

       .Build();

      App.Method(a

        + b,

        c);

 

注释规范

注释用来对编写的代码进行说明,包括功能说明以及实现说明,这样可以大大的提高程序的可读性,另外规范的注释还可以通过工具来生成相应的API文档,C#的注释规范有以下几种:

类注释

例:

/// <summary>

/// This is a Entity Class for Post.

/// </summary>

public class Post

 

属性及方法注释:

/// <summary>

/// Get post with id

/// </summary>

/// <param name="id">post's identity</param>

/// <returns>post instance</returns>

public Post GetPostById(int id)

 

代码单行注释:

/this is a single line comment

代码多行注释:

/*

this is comment1

this is comment2

*/

代码使用规范

代码的使用规范,或者说是代码编写的最佳“实践”(当然优良的格式规范也是一种最佳实践),它们是根据代码的实现/运行原理以及特定的应用场景进行实践的最佳方案,这些方案的使用除了可以提高代码的可读行外,还可以减少程序Bug、提高程序性能及安全性,如以下几个方面:

使用语言特性

this:使用this区分类型中的属性与变量、静态成员,可以提高程序可读性。

var:适当的使用var可以提高开发效率且不影响程序可读性,如在不知道返回值具体类型或者不需要知道类型的时候。

反例:

字符串内插(string interpolation):字符串内插是C#6.0的特性,使用字符串内插可以提高程序可读性:

例:

异常

当程序出现与预期不符时应该抛出异常让程序上游处理。

尽可能使用C#中内置的异常类型。

捕获异常必须处理。

获取指定异常而非统一使用Exception。

安全准则

基于证据的安全性和代码访问安全性提供非常强大的显式机制来实现安全。 大多数应用程序代码就可以使用由.NET 实现的基础结构。 在某些情况下,需要额外的应用程序特定的安全性,或通过扩展安全系统或通过使用全新临时方法构建。

使用.NET 强制执行权限和其他强制在代码中的,应建立屏障,以防止恶意代码访问您不希望其具有的信息或执行其他不需要的操作。 此外,必须在使用受信任代码的所有预期方案中平衡安全性和可用性。

本概述介绍代码可以用于处理安全系统的不同方式。

保护资源的访问

设计和编写代码时,尤其是在使用或调用来源未知的代码时,需要保护和限制该代码对资源的访问。 因此,请记住以下可确保代码安全的方法:

不使用代码访问安全性 (CAS)。

不使用部分信任的代码。

不要使用AllowPartiallyTrustedCaller特性 (APTCA)。

不使用 .NET 远程处理。

不使用分布式组件对象模型 (DCOM)。

不使用二进制格式化程序。

作为安全边界,部分受信任的代码不支持代码访问安全性和安全透明的代码。 建议在未实施其他安全措施的情况下,不要加载和执行未知来源的代码。 其他安全措施包括:

虚拟化

AppContainers

操作系统 (OS) 用户和权限

Hyper-V 容器

安全性方面是非特定代码

非特定于安全性的代码不对任何安全系统进行显示处理。 它通过所接收的任何权限来运行。 虽然无法捕获与受保护的操作 (例如,使用文件、 网络等) 相关联的安全异常的应用程序会在未经处理的异常,但安全性方面是非特定代码仍利用安全技术中的.NET.

非特定于安全性的库具有你应了解的特殊性质。 假设你的库提供使用文件或调用非托管的代码的 API 元素。 如果你的代码不具有相应的权限,它不会运行所述。 但是,即使代码具有权限,调用它的任何应用程序代码必须具有相同的权限才能正常运行。 如果调用代码没有正确的权限,SecurityException作为代码访问安全堆栈审核的结果将显示。

不是可重用组件的应用程序代码

如果你的代码是由其他代码不会调用应用程序的一部分,安全很简单,不可能要求特殊的编码。 但请记住,恶意代码可以调用你的代码。 代码访问安全性可能会阻止恶意代码访问资源,而此类代码仍然可以读取你的字段或可能包含敏感信息的属性的值。

此外,如果你的代码接受来自 Internet 或其他不可靠来源的用户输入,则务必要小心恶意输入。

托管到本机代码实现的包装

通常在这种情况下,某些有用功能是在你想要提供给托管代码的本机代码中实现的。 托管包装器可通过使用平台调用或 COM 互操作轻松写入。 但如果你这样做,包装器的调用方必须具有非托管代码权限才能成功。 在默认策略下,这意味着代码下载从 intranet 或 Internet 不适用于此包装器。

而不是授予非托管的代码权限的所有应用程序使用这些包装器,则最好仅对包装器代码将这些权限授予。 如果基础功能没有公开任何资源,且实现同样也安全,则包装器只需断言其权限,这可使任何代码通过它进行调用。 当涉及资源时,安全编码应该与下一节中所述的库代码案例相同。 因为包装器可能对这些资源公开调用方,所以仔细验证本机代码的安全性是必要的,这是包装器的责任。

库代码的公开受保护的资源

下面的方法是最强大的因此具有潜在危险 (如果正确执行) 对安全编码: 你的库作为其他代码访问某些资源不可否则,就像.NET 类强制实施的接口它们使用的资源的权限。 只要公开资源,你的代码首先就必须要求相应资源的权限(也就是说,必须执行安全检查),然后通常断言其权限来执行实际的操作。

代码使用规范是一个广泛的话题,除了以上一些通用的规范之外,还可以对OOP以及开发框架等方面根据实际情况制定规则,使用统一的规范进行开发可以让代码变得更加容易管理。

常用的代码规范工具

Visual Studio

VS是非常强大的IDE,在众多功能中当然不会缺少对代码规范的支持。

StyleCop

StyleCop是一个代码分析工具,StyleCop有两个版本StyleCop和StyleCop Analyzers,前者适用于VS2010-VS2017所有版本,它的原理是在编译时对代码进行分析,而StyleCop Analyzers仅支持VS2015+,它基于.Net的roslyn编译框架实现的,它支持开发时对代码进行实时分析(不再需要等编译)。

StyleCop

StyleCop Analyzers

Resharper

Resharper是jetbrains公司开发的一个VS收费插件,它不仅包含了代码分析,还具备了代码生成、编译、测试、调试等功能。

VS2017与Resharper的功能比较

EditConfig

EditConfig是一个跨编辑器/IDE的代码风格一致性维护工具(协议/插件),现在VS2017已经支持EditConfig

DocFx

DocFx是一个API文档生成工具,使用DocFx可以快速的搭建一个程序使用、及API文档,样式可参考:

DocFx教程

API文档

小结

本文主要介绍了C#中的编程规范,并将规范分为了两个类型,分别是格式规范和使用规范,前者主要目的是让代码格式达到一致性,后者则是规定了代码的使用方法,最大化的减少不同经验开发人员编写代码的质量,提高程序的可读性、性能、稳定性及安全性。

在开发过程中编程规范是一项非常重要的工作,它关系着代码是否能够被维护,提高可维护性可以减少团队成员增减、功能新增、代码变更等带来的高成本。

编程规范的制定并不简单,不同的人对编程规范也有不同的理解,特别是代码的使用规范,它要求制定者必须要有丰富的代码开发以及代码优化经验。为了确保规范能够顺利的制定,个人认为需要以先制定后修改的方式进行,先制定是为了不耽误开发工作,在开发工作开始之前制定好规范即可按规范开发,后修改,其一是在开发过程中发现不合理的地方进行修改(口说无凭,实践出真理),另外是随着团队能力的提高,可以总结更多的代码使用最佳实践。

文章的最后介绍了一些常用的规范工具.

   
次浏览       
相关文章

深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
相关文档

重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
相关课程

基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程