对C#.NET编程规范的个人见解

简介: 我们应该知道编程规范对于项目的生命周期多么重要,如果每个程序员写的代码都令其他人难以阅读、或者一个团队项目的代码却五花八门,这样的项目将会是怎么样的噩梦。

我们应该知道编程规范对于项目的生命周期多么重要,如果每个程序员写的代码都令其他人难以阅读、或者一个团队项目的代码却五花八门,这样的项目将会是怎么样的噩梦。

MS为提供了FXCop工具,用于自动检查代码的规范性、安全性和效率,所以,本文将围绕MS提供的C#.NET代码规范展开。

 

FXCop工具下载地址:http://www.gotdotnet.com/team/fxcop

1、命名约定

PascalCamel命名约定

编程的命名方式主要有PascalCamel两种(Pascal:每个单词的首字母大写,例如ProductTypeCamel:首个单词的首字母小写,其余单词的首字母大写,例如productType

 

标志符

规则

实例与描述

class

Pascal

Application

枚举类型enum

Pascal

记住,是以Pascal命名,切勿包含Enum,否则FXCop会抛出Issue

委托delegate

Pascal

Pascal命名,不以任何特殊字符串区别于类名、函数名

常量const

全部大写,单词间以下划线隔开

接口interface

Pascal

IDisposable 注:总是以 I 前缀开始,后接Pascal命名

方法function

Pascal

ToString

命名空间namespace

Pascal

.分隔,当每一个限定词均为Pascal命名方式,比如:

using ExcelQuicker.Framework

参数

Camel

首字母小写

局部变量

Camel

也可以加入类型标识符,比如对于System.String类型,声明变量是以str开头,string strSQL = string.Empty;

数据成员

m开头+Pascal命名规则,如mProductTypem意味member

属性

Pascal

 

 

1.1、局部变量命名

primitive的局部变量命名时,使用Camel命名规则,

比如:int type = 0;

double count = 0;

对于string类型定义,通常使用str前缀+Pascal命名的方式,

比如string strSQL = string.Empty; 这是一种典型的命名SQL语句字符串的方式

 

而对于此外的类型对象定义,通常的做法是使用obj前缀+Pascal命名的方式,来告知我们这个变量是一个对象

比如:Application obj Application = new Application();

 

1.2、参数命名

Camel命名规则,首字母小写

 

1.3、类数据成员/属性命名

数据成员命名以m开头+Pascal命名方式;

属性以Pascal命名

比如

class EQAppcalition

{

       private ArrayList mWorksheetCollection = new ArrayList();

public ArrayList WorksheetCollection

{

       get

       {

              return this.mWorksheetCollection;

       }

}

}

另外,类的成员数据/方法调用时,应该加上this限定符,this在编辑环境中是蓝色的,更利于我们区分局部变量、参数或静态变量,并且利于FXCop检测区分。

 

1.4、命名空间命名

.之间的限定字符串符合Pascal格式

 

1.5、委托缩写

委托的命名方式我常常以Pascal命名,或者可以在前面加入On

比如public delegate void OnMouseUp (object sender, MouseEventArgs e);用于处理当Mouse Up时触发的委托

 

1.6、自定义异常类

我建议自定义异常类以Exception结尾,

比如class EQException: Exception{…} 这是在我的ExcelQuicker控件中异常类的定义方式

1.7、枚举

枚举的命名是Pascal命名

 

1.8、常量命名

全部大写,单词间并且以下划线间隔,如

public const int LOCK_SECONDS = 3000;

 

1.9、命名缩写

在一般情况下,我们都不要使用缩写命名,我们从来不害怕长的变量命名,而却担心看不懂的命名。变量命名的原则是,尽最大努力让其他人在看到我们的变量/函数/…等的第一时间,大概能猜出它是做什么的。

比如:int productTypeCount = 0; //我们在第一时间就能知道它是记录产品的数量的变量

而对于糟糕的命名方式:int pTC = 0; //它是productTypeCount的简写,但是其他人或者我们在长时间以后还能知道它是做什么的吗?也许我们不得不查阅相关文档或跟踪代码前后文以明白其意义。

*我们应该认为:最优秀的代码它本身就是注释。我们需要做的,并不在于当时潦草的去实现些什么,而是要让我们的代码具备让他人维护或今后扩充的能力。人需要美,代码也一样。

2、注释规范

2.1、文件头部注释

在代码文件的头部进行注释,标注出创始人、创始时间、修改人、修改时间、代码的功能,这在团队开发中必不可少,它们可以使后来维护/修改的同伴在遇到问题时,在第一时间知道他应该向谁去寻求帮助,并且知道这个文件经历了多少次迭代、经历了多少个程序员的手。

样本:

/********************************************************************************

** 作者Eunge

** 创始时间:2004-6-8

** 修改人:Koffer

** 修改时间:2004-12-9

** 修改人:Ken

** 修改时间:2005-01-29

** 描述:

**    主要用于产品信息的资料录入,

*********************************************************************************/

我们甚至可以在这段文件头注释中加入版权信息、文件名、版本信息等。

 

2.2、函数、属性、类等注释

请使用///三斜线注释,这种注释是基于XML的,不仅能导出XML制作帮助文档,而且在各个函数、属性、类等的使用中,编辑环境会自动带出注释,方便你的开发。以protectedprotected Internalpublic声明的定义注释请都以这样命名方法。

例如:

/// <summary>

/// 用于从ERP系统中捞出产品信息的类

/// </summary>

class ProductTypeCollector

{

      

}

 

2.3、逻辑点注释

在我们认为逻辑性较强的地方加入注释,说明这段程序的逻辑是怎样的,以方便我们自己后来的理解以及其他人的理解,并且这样还可以在一定程度上排除BUG。在注释中写明我们的逻辑思想,对照程序,判断程序是否符合我们的初衷,如果不是,则我们应该仔细思考耀修改的是注释还是程序了

 

3、排版

我的排版原则与建议:

1、  每行语句至少占一行,如果语句过长(超过一屏),则该语句断为两行显示;

2、  把相似的内容放在一起,比如数据成员、属性、方法、事件等,并适当的使用#region…#endregion,我最喜欢把机器生成的代码都放在一个#region里面,比如在编写ASP.NET程序时,对应自动产生的控件定义,我常用#region Automatic Generated Web Components … #endregion把他们框住

3、  使用空格,

(1)       双目操作符的前后加空格(+, =, && )index = index + 1;

(2)       单目操作符前加空格(!, ++, ~ ) index ++;

(3)       逗号、分号只在后面加空格

 

4、  使用空行,在一段功能代码、或者函数、属性之间插入空行,这样会很直观。

 

4、界面控件命名

我的建议是使用默认控件名作为前缀,并且首字母小写,符合Camel规范,这样的好处是不必为未知的控件统一命名方式发愁,比如对于Label标签控件,有的人用缩写lbl,有的人用lab,有的人用lb……

protected System.Web.UI.WebControls.Button buttonQuery;

protected System.Web.UI.WebControls.DropDownList dropDownListProductType;

protected System.Web.UI.WebControls.TextBox textBoxManufactureDate;

 

5ADO.NET命名

类型

前缀

实例

Connection

con

conSQLServer1

Command

cmd

cmdProductType

Parameter

parm

parmProductTypeID

DataAdapter

dad

dadProducts

DataReader

dr

dtrProducts

DataSet

dst

dstProducts

DataTable

dt

dtblCDROM

DataRow

drow

 

DataColumn

Dcol

DataView

dvw

DataRelation

drel

 

 

 

 

 

6、代码可读性建议

1)注意运算符的优先级,我们应该尽量使用括号明确表达式的操作顺序,避免使用默认优先级,给我们以及维护人带来困扰

 

2避免使用不易理解的数字,用有意义的标识来替代(枚举和常量)

比如:

if(productType == 0)

      

else if (productType == 1)

      

(不推荐使用)

if(productType == ProductType.CD)

      

else if (productType == ProductType.DVD)

      

(推荐使用)

 

3代码中关系较为紧密的代码应尽可能相邻,比如使用objProductType.Name

而不是objProductType. Name

 

4)在界面层中尽量使用异常处理try语句,不要将错误的消息直接暴露给用户,而更应该的是把系统抛出的错误信息记录到LOG日志文件中去,告诉用户友好的提示信息

 

总结

       以上是我写.NET以及编程两年来对规范性的一些总结、体会。如果有疏漏、错误的地方,谢谢大伙的补充、纠正。

目录
相关文章
|
18天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
66 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
1月前
|
开发框架 算法 搜索推荐
C# .NET面试系列九:常见的算法
#### 1. 求质数 ```c# // 判断一个数是否为质数的方法 public static bool IsPrime(int number) { if (number < 2) { return false; } for (int i = 2; i <= Math.Sqrt(number); i++) { if (number % i == 0) { return false; } } return true; } class Progr
58 1
|
1月前
|
并行计算 安全 Java
C# .NET面试系列四:多线程
<h2>多线程 #### 1. 根据线程安全的相关知识,分析以下代码,当调用 test 方法时 i > 10 时是否会引起死锁? 并简要说明理由。 ```c# public void test(int i) { lock(this) { if (i > 10) { i--; test(i); } } } ``` 在给定的代码中,不会发生死锁。死锁通常是由于两个或多个线程互相等待对方释放锁而无法继续执行的情况。在这个代码中,只有一个线程持有锁,且没有其他线程参与,因此不
105 3
|
3月前
|
Linux C# 开发工具
C#开源的一款友好的.NET SDK管理器
C#开源的一款友好的.NET SDK管理器
|
11天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
C#/.NET/.NET Core拾遗补漏合集(持续更新)
|
1月前
|
SQL 存储 关系型数据库
C# .NET面试系列十:数据库概念知识
#### 1. 为什么要一定要设置主键? 设置主键是数据库设计中的一个重要概念,有几个主要原因: 1、唯一性 ```c# 主键必须保证表中的每一行都有唯一的标识。这样可以避免数据冗余和不一致性。如果没有主键或者主键不唯一,就可能出现数据混乱或错误。 ``` 2、查询性能 ```c# 数据库系统通常会使用主键来加速数据检索。主键通常会被索引,这样可以更快速地找到特定行的数据,提高查询效率。 ``` 3、关联性 ```c# 主键常常用于建立表与表之间的关系。在关系数据库中,一个表的主键通常与其他表中的外键建立关联,这种关系对于数据的一致性和完整性非常重要。 ``` 4、数据完
131 1
C# .NET面试系列十:数据库概念知识
|
1月前
|
XML 开发框架 .NET
C# .NET面试系列八:ADO.NET、XML、HTTP、AJAX、WebService
## 第二部分:ADO.NET、XML、HTTP、AJAX、WebService #### 1. .NET 和 C# 有什么区别? .NET(通用语言运行时): ```c# 定义:.NET 是一个软件开发框架,提供了一个通用的运行时环境,用于在不同的编程语言中执行代码。 作用:它为多语言支持提供了一个统一的平台,允许不同的语言共享类库和其他资源。.NET 包括 Common Language Runtime (CLR)、基础类库(BCL)和其他工具。 ``` C#(C Sharp): ```c# 定义: C# 是一种由微软设计的面向对象的编程语言,专门为.NET 平台开发而创建。 作
174 2
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
65 0

相关实验场景

更多