您的位置:首页 > 数据库

C#,数据库编码规范讲解

2017-08-25 17:52 615 查看

C#语言编程规范

遵循一定的编程规范,即有利于工程建设、团队合作,也是每个程序员的自身素质的体现。本文结合研发群实际工作情况,筛选了部分重要的、易实现的规范

1.1 命名规范

1.1.1 标识符命名

标识符的命名应当符合“min-length && max-information”(最小长度&最大信息量)原则。

标识符要采用常用英文单词或其组合,便于记忆和阅读,尽量避免使用汉语拼音来命名,推荐采用应用领域相关的术语来命名。

标识符只能由26个英文字母,10个数字,及下划线的一个子集来组成,并严格禁止使用连续的下划线(不易分辨),下划线也不能出现在标识符头或结尾(预编译开关和利用工具生成的代码除外);数字也不能出现在标识符的头部。

常量名都要使用大写字母, 用下划线 ‘_’ 分割单词。

程序中不要出现仅靠大小写区分的相似的标识符。

推荐不推荐
string strName;string strOtherName;
string strname;string STRNAME;
6. 一般变量名不得取单个字符(如i、j、k等)作为变量名,局部循环变量除外。

7. 尽量避免名字中出现数字编号,如Value1、Value2等,除非逻辑上的确需要编号。

1.1.2 类、方法命名

类名采用大小写结合的方法,构成类名的每个单词的首字母的首字母也必须大写。在构成类名的单词之间不用下划线。

接口命名在名字前加上“I”前缀,其它和类命名规范相同。

类方法的局部变量命名采用Camel规范或匈牙利规范。

方法名用大写字母开头的单词组合而成,且应当使用“动词”或者“动词+名词”(动宾词组)。

1.1.3 控件命名

控件命名应采用完整的英文描述符命名,名字的前缀是控件类型名缩写,符合匈牙利命名规范。

推荐不推荐
Lable控件 lblNameLable控件 Name
Button控件 btnSaveButton控件Save
TextBox控件 txtNameTextBox控件 Name
DataGrid控件 gridListDataGrid控件 list1

1.2 代码布局

源代码文件(.cs)的布局顺序是:using语句、命名空间、类。

if、else、else if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 { }。

//推荐
if (iCount < 100)
{
iCount = 500;
}
//不推荐
if (iCount < 100) iCount = 500;


禁止使用TAB键,必须使用空格进行缩进。缩进为4个空格。

程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。{ }之内的代码块使用缩进规则对齐。

推荐 不推荐

//推荐
void  Function(int intVar)
{  // 独占一行并与引用语句左对齐。
while (condition)
{
DoSomething() // 与{ }缩进4格
}
}
//不推荐
void Function(int intVar){
while (condition){
DoSomething();
}}


5.不同逻辑程序块之间要使用空行分隔。

//推荐
void Hey(void)
{
[Hey实现代码]
}
// 空一行
void Ack(void)
{
[Ack实现代码]
}

//不推荐
void Hey(void)
{
[Hey实现代码]
}
void Ack(void)
{
[Ack实现代码]
}
// 两个函数的实现是两个逻辑程序块,应该用空行加以分隔。


6.前台ASPX页面中标签必须规整对应,保存之前利用VS格式化工具格式化。

1.3 表达式和语句

在表达式中使用括号,使表达式的运算顺序更清晰。

if (((intYear % 4 == 0) && (intYear % 100 != 0))||(intYear % 400 == 0))
if (intYear % 4 == 0 && intYear % 100 != 0 || intYear % 400 == 0)


2.避免表达式中的附加功能,不要编写太复杂的复合表达式

3.在switch语句中,每一个case分支必须使用break结尾,最后一个分支必须是default分支。

正确 错误

switch (iMessage)
{
case SPAN_ON:
[处理语句]
break;
case SPAN_OFF:
[处理语句]
break;
default:
[处理语句]
break;
}
switch (iMessage)
{
case SPAN_ON:
[处理语句]
break;
case SPAN_OFF:
[处理语句]

default:
[处理语句]
break;
}


4.写在C#中的SQL语句,对于关键字要求全部大写,每个主要的 SQL 子句放在不同的行上。

5.循环嵌套次数不推荐大于3次。

1.4 业务代码规范

1.4.1 适量注释

一般情况下,源程序有效注释量必须在20%以上,尤其对个性化且功能较复杂的代码要有关键性的注释,注释语言必须准确、易懂、简洁。

1.4.2 变量初始化

值类型变量(int、struct)定义时要初始化值,引用类型变量(string、class)定义时,能初始化值的尽量初始化。

1.4.3 字符串拼接

由于字符串本身就是一个类,是引用类型的,在对字符串作拼接时,如果字符串较多并且需要多次拼接的情况下,C#使用StringBuilder类实现字符串拼接。

1.4.4 DataView的使用

获取DataView对象数据前,必须判断DataView中有数据.

正确 错误

DataView dv= XX.Select(“123”);
if(dv.count>0)
{
string a =dv[0][“name”];
}   DataView dv= XX.Select(“123”);
string a =dv[0][“name”];


针对DataView中的数据对象,如果需要判断为空,不能与null比较,因为该对象永远不会返回null,假如没有数据,返回的时DBNull对象。

DataView dv= XX.Select(“123”);
if(dv.count>0)
{
If(dv[0][“name”].ToString()!=””)
{
//XXXXX
}
}   DataView dv= XX.Select(“123”);
if(dv.count>0)
{
If(dv[0][“name”]!=null)
{
//XXXXX
}
}


1.4.5 减少频繁访问数据库的代码

循环体中访问数据库表并且当该访问表脚本很慢时,如datagrid前台绑定方法展示(简单表不作要求,数据量多且表结构较复杂的应尽量减少,方法是:一次性取出放内存,前台方法从内存中读取展示;通过联合查询、存储过程从库中一次性取出);其他for foreach while循环中有访问数据库表脚本应避免!

一次性取出的不要变相重复取,如上面已经定义了MisGuidRow,后面又重复出现该表的MisGuidRow。

1.4.7 SQL语句禁忌

避免使用select * from,一个原因是减少I/O开销,另外一个原因是走索引(不用建太多的覆盖索引、组合索引)。建议方法传字段参数,用多少取多少,自己可以用,别人也可以用。

避免只是为判断是否存在,使用dv.count,尤其是dv是select * 返回的。

数据库开发规范

2.1 语法规范

2.1.1 关键字及变量命名

SQL中的关键字均使用大写字母,字段名、表名均使用小写字母。

数据表最好起别名,以便于的优化器快速分析。

2.1.2 插入语句INSERT

尽量不要使用 INSERT INTO table VALUE(?,?,?,?,?)格式,要指出具体要赋值的字段,INSERT...SELECT的效率会有提高。

2.1.3 查询语句 SELECT

SELECT与FROM语句之间只定义返回的字段名,除非返回所有的字段,尽量不要使用 * ,字段名应按照表的字段物理顺序编写,字段提取要按照“需多少、提多少”的原则(因为大批量数据的抽取会影响SQL缓存的效率)。

使用COUNT()也是要避免的,因为COUNT()会对全字段做聚集,建议使用COUNT (0)或COUNT(1)这样的查询语句。

条件中使用OR 会引起全表扫描,比较影响查询效率,尽可能少用或不用,实在不行可以用UNION代替。NULL的检索要回避一下。

负逻辑如!=、<>、not in等,都会导致用表扫描来完成查询。当表较大时,会严重影响系统性能,可以用别的操作来代替。

使用DISTINCT是为了保证在结果集中不出现重复值,但是DISTINCT会产生一张工作表,并进行排序来删除重复记录,这会大大增加查询和I/O的操作次数。因此应当避免使用DISTINCT关键字。

使用ORDER BY和GROUP BY短语,任何一种索引都有助于SELECT的性能提高。注意如果索引列里面有NULL值,优化器将无法优化。

2.2 索引规范

2.2.1 索引创建的规则

通常如果一个表有5个字段经常作为查询条件,那么创建5个单独字段的索引,然后再创建一个包含这5个字段的组合索引。索引的列尽量编写在where条件语句的最后,以便执行计划命中索引。

2.2.2 索引不被使用

索引不被使用的几种情况:null,比较,not函数

2.2.3 索引列上不要计算

索引是针对原值建的二叉树,计算后原来的二叉树就用不上了。

2.2.4 索引列上>= 代替

高效:select * from emp where deptno >=4

低效:select * from emp where deptno > 3

两者的区别在于,前者dbms将直接跳到第一个deptno等于4的记录,而后者将首先定位到deptno等于3的记录并且向前扫描到第一个deptno大于3的。

2.3 注意事项

避免使用IN和NOT IN,使用EXIST和NOT EXIST代替。

将计算从等号左边移到右边,例如:把a*2>4 改为a>4/2;把TO_CHAR(zip) = ‘94002’ 改为zip = TO_NUMBER(‘94002’)。

不要使用NOT,如Goods_no != 2,要改为: where Goods_no>2 or Goods_no<2。

不要使用is null , 如WHERE DEPT_CODE IS NOT NULL 要改为: WHERE DEPT_CODE >=0;

删除全表数据时使用truncate 替代 delete,同时注意truncate只能在删除全表时适用,因为truncate是ddl而不是dml语句。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 语言 程序员