(摘录)C#编码规范
1 文件组织
1.1 C#源文件
把每个类都放在单独的文件中,文件名字和类名一致(用.CS作为扩展名)。类文件不要太长,不要超过2000LOC。必要时,分割代码,使结构更清晰。
1.2 目录安排
为每个命名空间创建一个目录(如,对于MyProject.TestSuite.TestTier使用MyProject/TestSuite/TestTier作为路径,不要使用带“.”的命名空间)。这样更易于映射命名空间到目录。
2 缩进
2.1 分行
如果表达式不适合单行显示,应根据下面通常的原则分行:
l 在一个逗号后换行
l 在一个操作符后换行
l 在表达式的高层次处换行
l 新行与前一行在同一层次,并与表达式的起始对齐
方法分行的例子:
long MethodCall(expr1, expr2,
expr3, expr4, expr5);
算术表达式分行的例子:
好的:
var = a * b / (c – g + f) +
4 * z;
坏的风格,要避免:
var = a * b / (c – g +
f) + 4 * z;
第一个是好的,因为分行符合高层次规则。
2.2 空白
不要使用空格缩进 - 使用tabs!
3 注释
3.1 块注释
通常要避免块注释,而使用C#标准的///注释来描述。如果希望使用块注释,应该使用下面的风格:
/ * Line 1
* Line 2
* Line 3
*/
块注释很少使用,通常是用来注释掉大块的代码。
3.2 单行注释
应该使用//注释掉一行代码,也可以用它注释掉代码块。当单行注释用来做代码解释时,必须要缩进到与代码对齐。
3.3 文档注释
单行XML注释的形式如下:
/// <summary>
/// This class…
/// </summary>
多行XML注释的形式如下:
/// <exception cref=”BogusException”>
/// This exception gets thrown as soon as a
/// Bogus flag gets set.
/// </exception>
4 声明
4.1每行声明的数量
建议每行只有一个声明,还方便注释,如:
int level; // indentation level
int size; // size of table
变量的命名意义要明确。如果能够自解释,如indentLevel,就不用注释。
不好的:
int a, b; // What is ‘a’? What does ‘b’ stand for?
4.2 初始化
尽量在局部变量声明时进行初始化,例如:
string name = myObject.Name;
或
int val = time.Hours;
注意:初始化对话框时,尽量使用语句:
Using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
……
}
4.3 类和接口的声明
当写C#类和接口时,应按照下面的格式规则:
l 在方法名字和参数列表的起始括号“(”之间没有空格
l 开括号“{”应出现在声明语句之后的下一行
l 闭括号“}”自己占一行,并缩进到对应的开括号位置
例如:
class MySample : MyClass, IMyInterface
{
int myInt;
public MySample(int myInt)
{
this.myInt = myInt;
}
void Inc()
{
++myInt;
}
void EmptyMethod()
{
}
}
5 语句
5.1 简单语句
每行应该只包含一个语句。
5.2 返回语句
返回语句不应该带有最外面的括号。
不应该使用:
return (n * (n + 1) / 2);
应该使用:
return n * (n + 1) / 2;
5.3 If, if - else, if else - if else语句
if, if – else和if else – if else语句应该按照下面格式:
if (condition)
{
……
}
if (condition)
{
……
}
else
{
……
}
if (condition)
{
……
}
else if (condition)
{
……
}
else
{
……
}
注意:即使某条件下只有一个语句,也要使用大括号“{”“}”。后面的循环等语句也一样。
5.4 for / foreach语句
for语句形式如下:
for (int i = 0; i < 5; ++i)
{
……
}
或者使用单行形式:
for (initialization; condition; updat);
单行形式可考虑使用while语句代替。
foreach语句如下:
foreach (int i in intList)
{
……
}
5.5 while / do – while语句
while语句如下:
while (condition)
{
……
}
空的while语句形式如下:
while (condition);
do – while语句如下:
do
{
……
}
while (condition);
5.6 switch语句
switch语句形式如下:
switch (condition)
{
case A :
……
break;
case B :
……
break;
default :
……
break;
}
5.7 try – catch语句
try – catch语句形式如下:
try
{
……
}
catch (Exception e)
{
……
}
或者
try
{
……
}
catch (Exception e)
{
……
}
finally
{
……
}
5.8 属性
属性形式如下:
public string Name
{
get
{
……
}
set
{
……
}
}
对于抽象属性:
public string Name
{
get;
set;
}
5.9 枚举
枚举形式如下:
public enum Color
{
Red,
Green,
Blue
}
6 空白
6.1 空行
使用空行按照逻辑关系分隔代码,能提高可读性。
在下面元素之间要使用一个空行:
l 构造函数
l 属性
l 方法
l 方法内的逻辑块
6.2 内部空格
在逗号或分号之后应该有一个空格,例如:
应该使用:
TestMethod(a, b, c);
不应该使用:
TestMethod(a,b,c);或者TestMethod( a, b, c );
操作符两边要有一个空格(递增和逻辑否等一元操作符除外),例如:
应该使用:
a = b;
不应该使用:
a=b;
应该使用:
for (int i = 0; i < 10; ++i)
不应该使用:
for (int i=0; i<10; ++i)或者for(int i=0;i<10;++i)
7命名约定
7.1 ADO.NET 命名规范
数据类型 |
数据类型简写 |
标准命名举例 |
Connection |
con |
conNorthwind |
Command |
cmd |
cmdReturnProducts |
Parameter |
parm |
parmProductID |
DataAdapter |
dad |
dadProducts |
DataReader |
dtr |
dtrProducts |
DataSet |
dst |
dstNorthWind |
DataTable |
dtbl |
dtblProduct |
DataRow |
drow |
drowRow98 |
DataColumn |
dcol |
dcolProductID |
DataRelation |
drel |
drelMasterDetail |
DataView |
dvw |
dvwFilteredProducts |
7.2 WinForm Control 命名规范
数据类型 |
数据类型简写 |
标准命名举例 |
Label |
lbl |
lblMessage |
LinkLabel |
llbl |
llblToday |
Button |
btn |
btnSave |
TextBox |
txt |
txtName |
MainMenu |
mmnu |
mmnuFile |
CheckBox |
chk |
chkStock |
RadioButton |
rbtn |
rbtnSelected |
GroupBox |
gbx |
gbxMain |
PictureBox |
pic |
picImage |
Panel |
pnl |
pnlBody |
DataGrid |
dgrd |
dgrdView |
ListBox |
lst |
lstProducts |
CheckedListBox |
clst |
clstChecked |
ComboBox |
cbo |
cboMenu |
ListView |
lvw |
lvwBrowser |
TreeView |
tvw |
tvwType |
TabControl |
tctl |
tctlSelected |
DateTimePicker |
dtp |
dtpStartDate |
HscrollBar |
hsb |
hsbImage |
VscrollBar |
vsb |
vsbImage |
Timer |
tmr |
tmrCount |
ImageList |
ilst |
ilstImage |
ToolBar |
tlb |
tlbManage |
StatusBar |
stb |
stbFootPrint |
OpenFileDialog |
odlg |
odlgFile |
SaveFileDialog |
sdlg |
sdlgSave |
FoldBrowserDialog |
fbdlg |
fgdlgBrowser |
数据类型 |
数据类型简写 |
标准命名举例 |
FontDialog |
fdlg |
fdlgFoot |
ColorDialog |
cdlg |
cdlgColor |
PrintDialog |
pdlg |
pdlgPrint |
7.3 WebControl 命名规范
数据类型 |
数据类型简写 |
标准命名举例 |
AdRotator |
adrt |
Example |
Button |
btn |
btnSubmit |
Calendar |
cal |
calMettingDates |
CheckBox |
chk |
chkBlue |
CheckBoxList |
chkl |
chklFavColors |
CompareValidator |
valc |
valcValidAge |
CustomValidator |
valx |
valxDBCheck |
DataGrid |
dgrd |
dgrdTitles |
DataList |
dlst |
dlstTitles |
DropDownList |
drop |
dropCountries |
HyperLink |
lnk |
lnkDetails |
Image |
img |
imgAuntBetty |
ImageButton |
ibtn |
ibtnSubmit |
Label |
lbl |
lblResults |
LinkButton |
lbtn |
lbtnSubmit |
ListBox |
lst |
lstCountries |
Panel |
pnl |
pnlForm2 |
PlaceHolder |
plh |
plhFormContents |
RadioButton |
rad |
radFemale |
RadioButtonList |
radl |
radlGender |
RangeValidator |
valg |
valgAge |
RegularExpression |
vale |
valeEmail_Validator |
Repeater |
rpt |
rptQueryResults |
RequiredFieldValidator |
valr |
valrFirstName |
Table |
tbl |
tblCountryCodes |
TableCell |
tblc |
tblcGermany |
TableRow |
tblr |
tblrCountry |
TextBox |
txt |
txtFirstName |
ValidationSummary |
vals |
valsFormErrors |
XML |
xmlc |
xmlcTransformResults |
7.4变量
1、 变量的作用域及前缀
前缀 |
说明 |
举例 |
P |
全局变量 |
pstrName |
St |
静态变量 |
ststrName |
M |
模块或者窗体的局部变量 |
MstrName |
A |
数组 |
AintCount[] |
2、 变量数据类型的前缀
C#数据类型 |
类库数据类型 |
标准命名举例 |
Sbyte |
System.sbyte |
sbte |
Short |
System.Int16 |
sht |
Int |
System.Int32 |
int |
Long |
System.Int64 |
lng |
Byte |
System.Byte |
bte |
Ushot |
System.Uint16 |
usht |
Uint |
System.Uint32 |
uint |
Ulong |
System.Uint64 |
ulng |
Float |
System.Single |
flt |
Double |
System.Double |
dbl |
Decimal |
System.Decimal |
dcl |
Bool |
System.Boolean |
bol |
Char |
System.Char |
chr |
Object |
System.Object |
obj |
String |
System.String |
str |
|
System.DateTime |
dte |
IntPtr |
System.Intpre |
intptr |
7.5其他
常量定义
常量=作用域+ c+数据类型+变量名
类对象定义
类实例=作用域+cls+变量名
类对象=C+名称
结构对象定义
结构对象实例=作用域+struc+变量名
结构对象=S+名称
命名空间定义
以层为前缀进行命名
接口定义
以大写I为前缀
窗体的命名规则
窗体名=frm+窗体名(名词+动词)
注意:保存的文件明和窗体名相同。
枚举定义规则
以Enum为前缀
事件命名规则
事件控制器要带有EventHandler后缀
使用sender和e命名两个参数
事件参数类要带有EventArgs后缀
考虑使用动词命名事件
对于有“之前”或“之后”概念的事件,要使用现在时或过去时命名
8 编程实践
8.1 书写顺序
书写类时,按照从上到下的顺序,类成员应该是域,构造函数,属性,方法。
8.2 成员可视性
类的域都应该是private,如果需要被外部访问,使用public属性进行访问。但也有例外:
其他相关参照:
http://www.cnblogs.com/William_Fire/archive/2004/08/01/29064.aspx
http://blog.csdn.net/wkjs/archive/2006/08/14/1061711.aspx