版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C# 编码规范When this document is released, it is to be followed and adhered to. If you have suggestions for improving this document, please e-mail your ideas to the author listed on the cover page. When released, a Change Control Board (CCB) would have reviewed this document and approved electronically
2、via a Document Change Order (DCO).目录1目标42概述43总体要求43.1程序结构化43.2代码可读性43.3代码结构化53.4正确性与容错性53.5可重用性54编码规范64.1文件结构6C# 文件6目录结构64.2缩进6换行6空格74.3注释7模块注释7单行注释8类注释8方法注释84.4声明9单行声明变量数9初始化9类和接口声明94.5功能语句10简单逻辑10返回语句10if-else语句10For / Foreach 语句11While/do-while 语句11Switch 语句11Try-catch 语句124.6空白12空白行12参数条件之间的空白13
3、表格式的样式134.7命名规范14大写14Pascal 风格14驼峰规则14大写风格14命名方法14类命名15接口命名15枚举命名15常量命名15参数命名15变量命名15方法命名15属性命名16事件命名16大写风格164.8开发习惯16可见性16不要硬编码数字174.9代码示例17作用域(“”)示例175参考186附录186.1XML注释标记的使用187修改历史221 目标为新宇DotNet组的C#程序员制定一个统一的编码规范,最大限度减少不同程序员开发的代码间的差异。2 概述 为了使应用程序的结构和编码风格标准化,便于阅读和理解编码,以提高开发效率和产品的标准化,制订一套开发规范和标准势在必
4、行。此外,好的编码约定可使源代码严谨、可读性强且意义清楚,与其它语言约定相一致,并且尽可能的直观。希望开发人员严格遵守此套开发规范和标准,并落实到自己的程序中。本规范主要针对C#程序员,但是其中许多规则同时适用于其他语言的程序员。3 总体要求3.1 程序结构化· 程序结构清晰,函数功能简单易懂(单个函数的代码行数不超过100行)3.2 代码可读性· 保持注释与代码完全一致· 每个源程序文件,都有文件头说明,详细见下节· 每个函数,都有函数头说明,详细见下节· 主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义· 处理过程的
5、每个阶段都有相关注释说明· 在典型算法前都有注释, 同时算法在满足要求的情况下尽可能简单· 利用缩进来显示程序的逻辑结构,缩进量一致并以Tab键为单位,定义Tab为 4个字节· 循环、分支层次一般不应超过五层· 代码简单的分支应该写在前面· 不允许同行出现两个语句· 空行和空白字符也是一种特殊注释· 一目了然的语句不加注释· 注释的作用范围可以为:定义、引用、条件分支以及一段代码· 常量定义(DEFINE)有相应说明3.3 代码结构化· 禁止GOTO语句· 用 CASE 实现多路分支&
6、#183; 避免不必要的分支· 用 IF 语句来强调只执行两组语句中的一组。尽量不使用 ELSE RETURN · 尽量避免从循环引出多个出口3.4 正确性与容错性· 所有变量在调用前必须被初始化· 不要比较浮点数的相等,如: 10.0 * 0.1 = 1.0 , 不可靠· 访问外部资源(数据库,外部文件)时使用规范的容错语句例如:trycatchfinally4 编码规范4.1 文件结构4.1.1 C# 文件尽量不要让你的类或者文件太长,一般不应超过2000行代码。请按照功能划分你的代码,使结构保持清晰。一般情况下,一个文件应当只有一个类,并
7、且文件名应该与类名保持一致。 4.1.2 目录结构应该为每个名称空间(namespace)建立一个目录(例如,我们可以为名称空间建立这样的目录:MyProject/TestSuite/TestTier)。这样做可以让你很快定位到指定名称空间下的类文件。 4.2 缩进4.2.1 换行如果表达式太长而一行无法写下时,请按照下列规范进行换行: l 可以在逗号后面进行换行 l 可以在操作符号后进行换行 l 尽量选择在较高层处进行换行 l 换行后的新行应当与前一行中同级别的运算符对齐 例子:方法调用换行: longMethodCall(expr1, expr2,
8、60; expr3, expr4, expr5); 算术表达式换行:规范的:var = a * b / (c - g + f) + 4 * z;不规范的:var = a * b / (c - g + f) + 4 * z; 上面第一个表达式的换行方式是符合规范的,它换行在括号外面(较高层)。另外请注意,换行后的新行应使用tab和
9、空格保持与前一行的同级运算符对齐,例如: > var = a * b / (c - g + f) +> .4 * z;'>'表示Tab符, '.'表示空格。你可以设置你的编辑环境,使Tab和空格在编辑时是可见的,这是一个不错的习惯。 4.2.2 空格我们选择Tab缩进作为缩进时采用的标准。 请不要使用空格代替Tab键!4.3 注释4.3.1 模块注释在一个程序模块的开始,应用注释说明模块的名字、功能、开发者和日期和版本变更历史,如下所示:/* * Copyright(c) Suzsoft DotNet Group * Description :
10、 Tenant access class * CreateDate : 2006-06-02 05:03:46 * Creater : Johnson Cao * LastChangeDate: * LastChanger : * Version Info : 1.0 * */ 4.3.2 单行注释程序员应当在算法比较复杂的表达式前、特殊含义的变量前或者在一整段功能代码开始之前添加适当的注释。我们要求这样的单行 注释采用”/”符号,例如:/ Calculate subTotalDecimal subTotal = 0;4.3.3 类注释在定义一个类之前,应用“/”注释说明类的功能、使用方法和特
11、殊的属性,如下所示:/ <summary>/ This class./ <remarks>/ Please note / </remarks>/ </summary>详细的xml注释标记的使用请参见附录。 4.3.4 方法注释在定义类成员方法前,应说明该过程/函数的名字、功能、输入/输出和版本变更历史,如下所示:/ <summary>/ This method ./ <param name="param1">this is a param of the method SomeMethod.</pa
12、ram>/ <retvalue>a return object</retvalue>/ </summary>/-/ Change History:/ DateWho Changes Made/ 2000-5-1Author1Initial creation/ 2000-5-15Author2Add some code/-public object SomeMethod(object param1)4.4 声明4.4.1 单行声明变量数我们推荐每行只声明一个变量,因为这样你可以在声明后面写上该变量的注释,例如:int level; / indentati
13、on levelint size; / size of table请不要在同一行声明不同含义的变量,比如: int a, b; /What is 'a'? What does 'b' stand for?上面的例子同样可以说明了没有意义的变量名称会让人很难理解,因此,在定义变量的时候,我们一定要给它们一个有含义的名字。 4.4.2 初始化最好在一定义后就初始化变量,例如:string name = strObject.Name;or int val = time.Hours;注意:如果你想要初始化对话框变量,建议使用using 声明方式例如:using (Ope
14、nFileDialog openFileDialog = new OpenFileDialog() .4.4.3 类和接口声明在声明类和接口的时候应当遵照下列规范: l 方法名称和放置参数的括号”(”之间不应该有空格 l 类名声明之后应另起一行写作用域开始符” l 作用域结束符”应当单独占一行,并与对应的开始符”处在同一缩进位置上 示例: Class MySample : MyClass, IMyInterfaceint myInt;public MySample(int myInt)this.myInt = myInt ;void Inc()+myInt;void EmptyMethod()
15、4.5 功能语句4.5.1 简单逻辑每一行代码应当只实现一个逻辑 4.5.2 if-else语句if-else应该按照这种格式书写:if(condition) DoSomething();. else DoSomethingOther();.4.5.3 For / Foreach 语句For循环语句格式:for(int i = 0; i < 5; +i) .或者,如果循环只有一个简单执行语句的话:for (initialization; condition; update) ;foreach循环格式:foreach(int i in IntList) .注意:即使循环中只有一句执行语句,
16、我们也要求使用” 4.5.4 While/do-while 语句While循环格式: while (condition) .对于空循环可以这样写:while (condition) ;do-while循环格式:do .while(condition);4.5.5 Switch 语句switch格式: switch (condition) case A:.break;case B:.break;default:.break;4.5.6 Try-catch 语句try-catch格式: try . catch (Exception) 或者:try . catch (Exception e) .或者
17、:try . catch (Exception e) . finally .4.6 空白4.6.1 空白行空白行有增强可读性的作用。它们隔离了逻辑上相互独立的模块。l 在下列情况中我们还可以使用双空白行: n 源文件中的两个独立的逻辑片断之间n 类和接口之间(但一般情况下我们还是建议一个文件一个类或接口)l 下列情况中我们可以使用单空白行: n 方法之间 n 属性之间n 方法内局部变量第一出声明前 n 方法内相对独立的逻辑之间 注意,尽量保持空白行和其他行具有同样的缩进,可以使今后插入代码能够保持相同的缩进。 4.6.2 参数条件之间的空白通过这些空白,可以使代码更容易被阅读,例如:TestM
18、ethod(a, b, c); 而不应该这样: TestMethod(a,b,c)但是也不应有过多的空格,比如:TestMethod( a, b, c );操作符和变量或数字之间应该有空格:a = b; / don't use a=b;for (int i = 0; i < 10; +i) / don't use for (int i=0; i<10; +i)/ or/ for(int i=0;i<10;+i)4.6.3 表格式的样式连续的多行付值语句可以这样子写:string strName = "Mr. Ed"int nValue =
19、5;Test aTest = Test.TestYou;利用空格对齐所有的“=”,使代码块看起来像表格一样。 4.7 命名规范4.7.1 大写 Pascal 风格变量的首字母大写,如:Name 驼峰规则除了首个单词,每个单词的首字母大写,如:TestName 大写风格只在少于两个字母的缩写中使用大写。三个以上字母的缩写都应该使用PASCAL风格。4.7.2 命名方法通常我们采用匈牙利命名法来为变量命名。 匈牙利命名法通常采用变量类型的缩写作为前缀,变量含义的全拼作为后缀的方法来命名变量。这种命名方法被广泛的采用在windows程序开发中,它因由一匈牙利
20、程序员创立而得名。 注意:好的变量命名不是突出其类型,而是突出其含义。 对于UI控件,我们强制要求缩写前缀,例如:System.Windows.Forms.Button btnCancel;System.Windows.Forms.TextBox txtName; 类命名l 使用名词或名词短语命名类。l 使用Pascal风格.l 谨慎使用缩写命名类。.l 不要使用任何类前缀(如C). 接口命名l 使用名词或名词短语命名接口.(例如 IComponent 或 IEnumberable) l 使用Pascal风格l 使用大写的I作为首字母,表示为接口 枚
21、举命名l 使用Pascal风格l 不使用前缀 l 使用单数名词命名 常量命名l 采用有意义的单词命名 l 使用全部大写字母拼写 参数命名l 相对变量而言,参数更注重本身的含义作为命名 l 使用驼峰规则命名 变量命名l 作为循环中的运算子的变量,更适合采用简单的命名,如i, j, k, l, m, n 方法命名l 采用动词命名,或者动词词组 l 使用Pascal风格 属性命名l 使用名词或名词短语命名属性 l 使用Pascal风格 事件命名l 使用EventHandler作为事件句柄的后缀 l 使用两个参数
22、:sender 和e l 使用Pascal风格l 使用EventArgs 作为Event Argument类型名的后缀l 使用进行时动词和过去式动词作为事件的名称 0 大写风格TypeCaseNotesClass / StructPascal Casing InterfacePascal CasingStarts with IEnum valuesPascal Casing Enum typePascal Casing EventsPascal Casing Exception classPascal CasingEnd with Exce
23、ptionpublic FieldsPascal Casing MethodsPascal Casing NamespacePascal Casing PropertyPascal Casing Protected/private FieldsCamel Casing ParametersCamel Casing 4.8 开发习惯4.8.1 可见性请避免将类变量或一个实例声明为公共类型的变量,而应该将其声明为私有变量。如果你确实需要公开一个类变量或者实例的话,可以使990用属性(Property)来公开它。4.8.2 不要硬编码数字也
24、就是说,在你的逻辑代码中,不要采用数字直接参与计算,尤其是那些可能需要改变的数字。你应该将它付值给一个常量,使用该常量参与计算。这样做得好处是,如果这个数字改变的时候,你不必在代码中将他找出并修改,而只需修改常量的值。public class MyMathpublic const double PI = 3.14159.4.9 代码示例4.9.1 作用域(“”)示例namespace ShowMeTheBracketpublic enum Test TestMe,TestYoupublic class TestMeClassTest test;public Test Test get retu
25、rn test;set test = value;void DoSomething()if (test = Test.TestMe) /.stuff gets done else /.other stuff gets done作用域("”)应该在下列代码后另起一行开始:l Namespace声明后 l Class/ Interface / Struct 的声明后 l Method声明后 l 循环或者判断(ifelse)后5 参考 6 附录6.1 XML注释标记的使用6.1.1 Section 标记Section 标记用于定义不同的代码文档的区域。它们都是顶级标记,Block 标记、I
26、nline 标记都应包含在某个 Section 标记的内部。(除非自定义了扩展 XSLT 转换,否则,在 Section 标记外部的 Block 标记或 Inline 标记都被忽略。)标记说明<event>NDoc 扩充对某个成员可能引发的事件的说明。<example>“示例”,帮助类库使用者理解类型/成员使用方法的示例代码。<exception>对某个成员可以抛出的异常的说明。<exclude/>NDoc 扩充指示 NDoc 文档引擎将被标记的类型/成员排除在代码文档之外。与文档引擎的“可见性”配置不符的,以 exclude 优先。<in
27、clude>将代码文件外部的某 XML 文件中的一部分包含进代码文件来。<overloads>NDoc 扩充为“重载列表”页面准备摘要、备注、示例等文档内容。只需在重载成员的第一个成员前面书写此区域即可。<overloads> 标记有两种形式:· 简单的形式,直接在 overload 中写文本,这些文本被处理为“重载列表”页面的摘要。没有备注、示例等区域。 · 复杂的形式,在 overload 内部,包含 summary, remarks, example 等标记分别表示“重载列表”页面的摘要、备注、示例等。 示例:/<overloads
28、>This method has two overloads.</overloads>/<summary>This overload just says hello.</summary>public void SayHello() . /<summary>This one says hello to someone.</summary>public void SayHello(string toSomeone) . <param>成员的参数说明。<permission>访问某成员所必需的 .NET Fra
29、mework 安全性 CodeAccessPermission。<preliminary>NDoc 扩充将某类型/成员标记为“预发布”。内部的文本被当作警告文本用红色显示,可以包含 <para> 表示多行文本。如果缺少内部文本,则显示默认的警告文本: “此文档为预发布版本,在未来版本中有可能改变。”。 如果需要把全部类型/成员都标记为“预发布”,请使用文档引擎的 Preliminary 配置项。<remarks>“备注”,对 <summary> 的进一步注解。<returns>“返回值”。<seealso>向页面的“请参见
30、”区域添加一个链接。请不要将此标记包含在 <remarks> 内部,它是一个顶级标记。两种可选的语法:· <seealso href=" · <seealso cref="System.Data.DataSet">DataSet</seealso> <summary>“摘要”,对类型/成员的摘要说明。<threadsafety>NDoc 扩充“线程安全”,说明类型在多线程环境中是否安全。NDoc 提供 static 和 instance 两个布尔的属性,可以自动生成像 .NET Framework SDK 类库文档中那样的标准文本。threadsafety 标记内部可以包含额外的文本,会被显示到标准文本的下方,说明额外的信息。例如:/ <summary>The summary description for SafeClass.</summary>/ <threadsafety stati
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版电力工程设计咨询合同2篇
- 二零二五年度高新技术企业承包商担保合同3篇
- 二零二五版户外用品促销员活动策划合同2篇
- 二零二五年度酒店前台正规雇佣合同范本(含劳动合同变更及续签规则)3篇
- 二零二五版港口安全评价与安全管理合同3篇
- 二零二五版环保工程保险合同3篇
- 二零二五版外资企业往来借款税务筹划合同3篇
- 二零二五年财务顾问企业财务管理咨询合同3篇
- 二零二五版智能家居产品销售安装合同2篇
- 二零二五年度钢筋行业购销合同规范范本5篇
- 不同茶叶的冲泡方法
- 光伏发电并网申办具体流程
- 基本药物制度政策培训课件
- 2025年中国华能集团限公司校园招聘高频重点提升(共500题)附带答案详解
- 建筑劳务专业分包合同范本(2025年)
- GB/T 45002-2024水泥胶砂保水率测定方法
- 广东省广州海珠区2023-2024学年八年级上学期期末数学试卷(含答案)
- 飞行原理(第二版) 课件 第10章 高速空气动力学基础
- 广西《乳腺X射线数字化体层摄影诊疗技术操作规范》
- 山西省2024年中考道德与法治真题试卷(含答案)
- 五年(2020-2024)高考地理真题分类汇编(全国版)专题12区域发展解析版
评论
0/150
提交评论