C#编程规范(常用版)
编程规范的目的
一个软件的生命周期中,80%的花费在于维护;
几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护;
编码规范可以改善软件的可读性,可以让程序员尽快而彻底的理解新代码;
为了执行规范,每个软件开发人员必须一致遵守编码规范;
使用统一编码规范的主要原因,是使应用程序的结构和编码风格标准化,以便于阅读和理解程序代码;
好的编码规范可使源代码严谨、可读性强且意义清楚,与其它语言约定相一致,并且尽可能的直观。
干程序,我们是专业的!
命名规范
通常来讲,名称是以意思相近的英文描述而命名的;例如:一个打开连接的方法 => open connection => OpenConnection();
到达 看其名,知其意 的效果;提高代码的可读性和理解性。
1. Pascal (大驼峰)命名方式
命名空间、类、接口、抽象类、结构体、枚举类、方法名、以及类中的属性,须要使用 Pascal 命名规范;名称中每一个单词的首字母都要大写;
例如:HttpClient、GetString() ;
在这里,本人还想分享一下我自己的编程习惯。
接口
官方文档中提到,接口的命名需要在其名称前加大写字母“I”,取自于 interface 关键字,例如:IDisposable、IDbConnection;
抽象类和枚举类
抽象类和枚举类是两种特殊的类,我们也可以在自定义的抽象类名称前加大写字母“A”,取自于 abstract 关键字,例如:ADataCollector 数据采集抽象类;
而对于枚举类,我们可以在自定义的枚举类名称前加大写字母“E”,取自于 enum 关键字,例如:ELogType 日志类型枚举类;
当然,这个只是我个人的小习惯,目的只有一个,更易于理解所写的代码;只要看到 A 开头的类名,就知道是自定义的抽象类,只要看到 E 开头的类名,就知道是自定义的枚举类。
(以上两点并不是必须的,根据个人意愿而为之)
实体类
实体类是非常常用的自定义类,类名最好用 “Entity” 结尾;例如:用户信息实体类 UserInfoEntity;好处也是易于理解,只要看到以 “Entity” 结尾的类名,就知道是一个实体类。
或者用 “Model” 结尾;例如:UserInfoModel 用户信息实体类。( 不推荐,因为 “Model” 释义为“模型”,模型与实体类还是有很大区别的 )
通用的工具类或帮助类
在实际开发中我们会自定义许多的通用类,以便提高开发效率,而这样的类,我们一般在其类名后面加上 “Tool”或“Utils”或“Helper” 结尾;例如:JsonTool、HttpUtils、SqlHelper 等。
2. Camel (小驼峰)命名方式
方法参数、局部变量、以及私有的成员变量,须要使用 Camel 命名规范;名称中第一个单词是小写的,从第二个单词起,后面每一个单词的首字母都要大写;
例如:
// 类中 私有的 成员变量
// 用来指示是否停止任务
private bool _isStopTask = true;// 一个 sql 查询的方法
public DataTable QueryBySql(string sql, object paramList) // 方法参数
{string tableName = "Test"; // 局部变量DataTable data = new DataTable(); // 局部变量// ... 其他代码return data;
}
这里需要注意一点的是,对于私有的成员变量,须要在变量名前添加 “_” 下划线前缀,以便区分方法参数和局部变量。( C# 的源码里就是这么写的 )
3. bool 类型的命名
对于 bool 类型的方法、属性、参数、变量等,还是依据上面的命名规范,一般会在名称的前面添加 “is”或“Is”;( C# 的源码里就是这么写的 )
例如:isSucc 是否成功(参数或局部变量),IsFinish 是否完成(属性),IsChange() 是否改变(方法),_isStopTask 是否停止任务(私有的成员变量)等。
4. 控件命名
通常采用 控件名简写 + 英文描述,英文描述则使用 Pascal 命名方式;例如:登录按钮 btnLogin ,姓名输入框 txtName 等。
代码外观
1. 换行
当你的代码写在一行很长的时候,需要使用编辑器上的横向滚动条来拖动以便查阅时,这时候请务必考虑代码换行。
我们的目的只有一个 —— 不拖动滚动条就能看全代码。
如此一来,我们更方便的查阅代码,也更易于理解上下文的代码逻辑,不至于来回的拖动滚动条( 这样的操作真的很烦 )。
换行并不是随意的换行,我们是专业人士,需要注意一下两点:
在逗号后换行
示例:
// 此方式不可取
public static void WriteLog(string logFilePath, ELogType logType, string exeMethodName, string methodExeTime, string customMsg, string sysMsg = null, string addContent = null, string methodExeIdNum = null)
{// ... 代码段
}// 应采取这种方式
public static void WriteLog(string logFilePath,ELogType logType,string exeMethodName,string methodExeTime,string customMsg,string sysMsg = null,string addContent = null,string methodExeIdNum = null)
{// ... 代码段
}
在操作符前换行
示例:
// 此方式不可取
string url = $"http://pjcy.mof.gov.cn/billcheck/einvoice_page/queryEInvoice?billCode={entity.InvoiceCode}&billNumber={entity.InvoiceNumber}&randomNumber={entity.CheckNumber}&code={imgCode}&totalAmount={entity.InvoiceAmount}&date={entity.InvoiceDate}";// 应采取这种方式
string url = $"http://pjcy.mof.gov.cn/billcheck/einvoice_page/queryEInvoice?"+ $"billCode={entity.InvoiceCode}"+ $"&billNumber={entity.InvoiceNumber}"+ $"&randomNumber={entity.CheckNumber}"+ $"&code={imgCode}"+ $"&totalAmount={entity.InvoiceAmount}"+ $"&date={entity.InvoiceDate}";
2. 空行
空行是为了将逻辑上相关联的代码分块,以便提高代码的可阅读性。
例如:
每一个方法之间至少有一行空行,如下图,
不同的逻辑块,加入空行,如下图,
3. 语句
每行最多包含一个语句,不要在同一行内放置一句以上的代码语句; 这会使得调试器的单步调试变得更为困难。
示例:
int a = 1; int b = a + 1; // 不可取// 可取的
int a = 1;
int b = a + 1;
代码注解
代码注解就四种,//、///、/* */、#region #endregion;最基础的东西了,本人在这里就不再一一赘述其用法了;
在此我主要想说一下实际开发中的应用。
1. 注解一定要保持最新,一旦代码变更,相关的注解也要跟着变更释义,时刻保证自己或他人能够看懂理解。
2. 注解一定要写在相关代码的前一行,或代码本行的末尾处;切记,不可把注解写在相关代码的后面一行( 下面一行 )。
3. 避免多余的或不适当的注解,移除所有无关的注解。
4. 对于类、接口、成员的注解,强烈推荐使用 /// 注解,这样在对其调用和使用时,可以直接看到注解信息,如下图,
5. 善用 #region #endregion 预处理指令;#region 是一个分块预处理指令,它主要用于编辑代码的分段,在编译时会被自动删除;
在这里我不得不说一个现象,总是有一些小伙伴喜欢每一个方法外面都套一组 #region #endregion ,这并不是一个好习惯。
通常我们使用 #region 来给相关联的一片长代码分段,而不是滥用这个指令。例如:一组( 多个 )相关联的方法或一段长逻辑的代码 等,如下图,
文件定义
1. 通常情况下,一个 cs 文件只定义一个 类、接口、枚举、结构体;只有特殊情况可将多个类定义在同一个 cs 文件中,而这 必须是紧密关联的多个类。
2. 类名应该与 cs 文件名保持一致,以便于通过文件名查找到类;例如 UserInfo 类 应该在 UserInfo.cs 文件里。
需要注意的常规性编程问题
1. try { } catch { throw } 异常处理
不要出现如下所示的无意义的 try - catch { throw } 代码块;
// 1.
try
{// ... 可能会抛异常的代码段
}
catch (Exception ex)
{throw ex;
}// 2.
try
{// ... 可能会抛异常的代码段
}
catch (Exception)
{throw;
}
如果你的代码里有像上面一样的 try - catch { throw } 写法,在此强烈建议你移除像这样的 try - catch { throw } 写法。( 你可以去查阅官方文档,以理解 try - catch { throw } 几种不同写法的区别 )
推荐使用下面的写法:
try
{// ... 可能会抛异常的代码段
}
catch (Exception ex)
{throw new Exception("自定义的异常消息", ex);
}
2. 字符串拼接
当遇到长字符串的拼接时,强烈建议你使用 StringBuilder 类型来拼接或处理字符串。( 这种情况下不要使用 string 类型 )
例如:较长的 SQL 语句拼接,如下图
3. 自定义枚举类
第一,枚举类不要去继承 int 类型,或是其他的整数型类型。若你要使用枚举类中枚举项的实际数值,请使用强类型转换。
第二,枚举类中的枚举项,一定要赋值于一个固定的数字( 以免在后面扩展枚举项时混淆枚举项的实际值 )。如下图:
Visual Studio IDE 的巧用
1. 每次在写完代码保存之前,按一次 Ctrl + E + D 快捷键( C#开发环境,如果不是请自行设定 IDE 的开发环境 ),编辑器会自动格式化代码,一是代码美观,二是易于阅读代码。
2. 当一个 cs 源代码文件完成后,请回到顶部,移除多余的 using 引用( 快捷键 Ctrl + R + G );如下图:
3. 解决并消除有警告的代码,如下图:
通过 IDE 点进去查看有警告的问题代码,解决并消除它们,以确保你的项目中没有问题代码。
C#编程规范(常用版)相关推荐
- C语言编程规范--常用缩写词
常用缩写词 缩 写 全 称 a addr address admin / adm administrator app application arg argument asm assemble asy ...
- 编程规范学习资料清单
资料清单包括: 1. c C软件编程规范总则.lwp 华为C编程规范 2. c# 华为C#编码规范 3. c++ C++编程规范 C++编程规范_1(排版) C++ ...
- 《安富莱嵌入式周报》第280期:支持在线仿真编程的网页版电子开发,CAN总线防攻击实现,BigFAT 规范打破了 FAT 每个文件 4GB 的限制
往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...
- [转]阿里编程规范(精简版)
文章目录 1.简介 2.命名: 3.格式规约 4.注释规约 5.OOP规约 6.集合处理 7.控制语句 8.异常 9.日志 10.单元测试 11.工程规约 1.简介 统一规范标准将有助于提高行业编码规 ...
- Java 编程规范 -- 易错精简版
Part 1 – 易错点 -- edit by liudeyu,If you have any adivice or suggestion, please participate in the di ...
- 简明 Python 编程规范v2
赖勇浩(http://laiyonghao.com) 注:之前发布一篇<简明 Python 编程规范>(见:http://blog.csdn.net/lanphaday/article/d ...
- 华为c语言编程规范_单片机开发之C语言编程基本规范
为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范.本标准规定了程序设计人员进行程序设计时必须遵循的规范.本规范主要针对单片机编程语言和08编译器而言,包括排版.注释.命名.变量 ...
- 黑马程序员:Java基础总结----Java语言编程规范
黑马程序员:Java基础总结 Java语言编程规范:参考自SUN公司文档 ASP.Net+Android+IO开发..Net培训.期待与您交流! I. 排版规范 A. 规 ...
- 简单叙述python的编程规范_简明 Python 编程规范
注:之前发布一篇<简明 Python 编程规范>(见:http://blog.csdn.net/lanphaday/article/details/2834883),本是我给当时所在的公司 ...
最新文章
- PYTHON自动化Day12-unittest自动注册登录
- PyQt5 技术篇-scrollArea不显示滚动条解决方法,Qt Designer不显示滚动条,滚动条的显示和隐藏
- java多线程------实现Runnable接口创建多进程,实现资源共享
- LA3971 组装电脑
- java 正则表达式 替换字符串img标签的路径_python面试题汇总第06期-正则表达式(内附7题及答案)...
- Centos 7 更改网卡名字
- Vue — 第一天(极速入门)
- POJ-1050 To the Max 二维最大子段和
- Leetcode每日一题:56. I. 数组中数字出现的次数
- 强悍的 Linux —— 系统文件及其作用
- 开发者开源软件商业模式
- ABAP:SmartForms 之二--设计
- Qt界面制作简单教程,调用python代码
- 如何让地面不起灰_水泥地面起灰怎么办?老师傅6招搞定了
- css背景颜色和图片
- 尚医通项目150-170:预约挂号、微信支付功能
- mysql表date类型长度_mysql中数据类型的长度解释
- 题解 乃爱与城市拥挤程度
- Socket异步服务器,可以监控客户端的状态,功能有,文字测试,服务端向客户端传输屏幕录像(UDP传输)、监控客户端屏幕(UDP传输),抖动用户窗体、发送文件给用户、扫描客户的C盘目录。
- iOS IAP应用内购详细步骤和问题总结指南
热门文章
- 基于WOA优化的svm最优参数计算仿真
- 使用Android stdio中的Webview显示网页时提示net::err_access_denied是为什么?
- 163VIP邮箱哪个好?为什么要使用邮箱客户端?
- 电脑大文件夹怎么加密?大文件夹方法介绍
- 一看就会☀️Go异常处理recover,panic
- html5 svg中国地图map悬停显示省市地区代码
- 迷之中本聪Satoshi Nakamoto
- 女孩到女人(强烈推荐)
- Android的折叠华为,Huawei Mate Xs 华为5G折叠机机,发售日期+售价,8寸屏幕+超薄设计+Android 10系统...
- Windows Wce认证过程MS11-080提权使用