《C#编程风格英汉对照》.docx

上传人:b****4 文档编号:4031743 上传时间:2022-11-27 格式:DOCX 页数:75 大小:68.42KB
下载 相关 举报
《C#编程风格英汉对照》.docx_第1页
第1页 / 共75页
《C#编程风格英汉对照》.docx_第2页
第2页 / 共75页
《C#编程风格英汉对照》.docx_第3页
第3页 / 共75页
《C#编程风格英汉对照》.docx_第4页
第4页 / 共75页
《C#编程风格英汉对照》.docx_第5页
第5页 / 共75页
点击查看更多>>
下载资源
资源描述

《C#编程风格英汉对照》.docx

《《C#编程风格英汉对照》.docx》由会员分享,可在线阅读,更多相关《《C#编程风格英汉对照》.docx(75页珍藏版)》请在冰豆网上搜索。

《C#编程风格英汉对照》.docx

《C#编程风格英汉对照》

C#编程风格

目录

第一章2

第2章3

2.1空白3

2.2花括号7

2.3类的组织10

第三章11

3.1一般原则11

3.2缩略形式13

3.3预处理器符号13

3.4类型和常量14

3.5枚举15

3.6接口15

3.7属性16

3.8方法16

3.9变量和参数17

3.10特性18

3.11命名空间18

3.12事件处理19

3.13异常19

第四章19

4.1一般原则20

4.2API21

4.3内部代码23

第五章26

5.1工程26

5.2类的设计28

5.3线程安全和并发34

5.4效率35

第六章38

6.1类型38

6.2语句和表达式40

6.3控制流程41

6.4.类43

6.5生命周期45

6.6字段和属性48

6.7方法49

6.8特性50

6.9泛型51

6.10枚举51

6.11类型安全、强制转换与转换53

6.12错误处理和调试53

6.13事件、委托和线程57

第七章58

7.1文件58

7.2命名空间58

7.3程序集60

第一章

一般原则

编写性能良好的软件固然重要,但专业的开发者还应注意其他许多问题。

好多的软件能完成任务,但以一致风格写成的卓越的软件则明晰、健壮、可维护性、可支持且可扩展。

1.保持原有风格

修改别人编写的软件时,应遵循原始代码的风格。

修改时不要引入新风格,也

不要仅为了吻合新风格而重写就旧软件。

在一个源代码文件中存在多种不同风格会使代码更难读懂。

为修改风格而重写代码将产生本不可避免的缺陷,增加软件成本。

2.坚持最小惊奇原则

最小惊奇原则建议你避免做出可能让其他软件开发人员吃惊的事情。

这意味着,软件所展示的互动及行为方式必须可预料并保持一致。

如果不是这样,文档就必须清晰地指出所有非通常的用法或行为。

为了降低其他人在使用你的软件时遭遇惊奇的可能性,你应当在软件的设计、实现、打包和文档中强调以下原则:

简单性用简单的类和简单的方法满足用户期望。

清晰性确保么个类、接口、方法、变量和对象都有清晰地目的。

阐明何时、何处、如何使用它们。

完整性提供任一可能的用户期望找到和使用的最小功能。

创建完成整的文档,描述所有特性和功能。

一致性相似实体的外观和行为应该相同,不同实体的外观和行为应该不同。

应该尽可能制定并遵守相关标准。

健壮性对软件中可能出现的错误和异常做出预测,并将解决方法记入文档。

不要隐藏错误,也不要等着用户去发现错误。

3.第一次就作对

对所有代码实施这条规则,不仅限于正式产品的代码。

原型或实验性代码多半会用到最终产品中,所以你改洞悉先机。

即便代码永远不会采用到正式产品中,别人也可能读到它。

任何阅读你的代码的人,都会从你的专业性和贯彻这些规则的先见之明中获益匪浅。

4.记录所有非规范行为

没有十全十美、普适一切的标准。

有时你会有偏离某条既定标准的需要。

无人如何也要努力保持清晰和一致。

在决定忽略某条规则之前,你应该先确信自己了解该条规则存在之理由,以及不采用该规则会引起的后果。

如果你决定要违反某条规则,记下这么做的原因。

这是第一守则。

5.考虑采用代码检查工具强制遵循编码标准

可采用源代码分析工具检查嗲吗是否符合编号标准和最佳实践。

例如,FxCop是一种流行的.NET代码分析工具,其利用反射技术、MSIL解析和调用图分析来检查代码是否符合.NET框架设计的指导原则。

FxCop可扩展,所以能加入你所在组织的特殊编码标准。

第2章

格式

2.1空白

6.使用空白

空白时页面上没有可见字符的区域。

只有少量空白的代码很难阅读和理解,故应多用空白来凸显方法、注释、代码块和表达式。

使用单个空格分隔符控制流程语句中的关键字、圆括号以及括号:

for(…)

{

//……….

}

while(…)

{

//…

}

do

{

//….

}while(…)

switch(…)

{

//…

}

if(…

{

//…

}

elseif(…)

{

//…

}

else

{

//…

}

try

{

//…

}

catch(Exception)

{

//...

}

finally

{

//…

}

在二元操作符左右分别放一个空格,“.”操作符除外:

doublelength=Math.Sqrt(x*x+y*y);

doublexNorm=(length>0.0)?

(x/length):

x;

doublecurrentTemperature=engineBlock.Temperatuer;

在逗号和分号后面放一个空格:

VectornormalizedVector=NormalizeVector(x,y,z);

for(inti=0;i<100;i++)

{

//…

}

在方法声明中,括号内的参数列表的各项间加上空格:

VectorNormalizeVector(doublex,doubley,doublez)

{

//…

}

使用空行分隔方法体中的逻辑块:

publicvoidHandleMessage(Messagemessage)

{

stringcontent=message.ReadContent();

switch(message.ErrorLevel)

{

caseErrorLevel.Warning:

//…进行一些操作…

break;

caseErrorLevel.Severe:

//…进行一些操作…

break;

default:

//…进行一些操作…

break;

 

}

}

使用空行隔开类中每个方法定义:

publicvoidSendEmail()

{

//…

}

publicvoidSendFax()

{

//…

}

7.使用缩进的语句块

改进代码可读性的方法之一是将多条独立的语句组合为语句块,统一缩进,使之与其他代码区分开。

如果使用集成开发环境(如VisualStodio)生成代码应确认组内每个成员均采用相同的缩进规则。

如果手工编写代码,使用两个空格的缩进方式,在确保可读性的同时也不至于浪费过多空间:

voidPesterCustomer(Customercustomer)

{

customer.SendLetter();

if(customer.HasEmailAddress())

{

customer.SendEmail();

if(customer.IsForgetful())

{

Customer.ScheduleReminderEmail();

}

}

if(customer.HasFaxNumber())

{

Customer.SendFox();

}

}

如果你负责管理开发团队,别让团队中的每个开发人员自行选择缩进量和缩进风格,应设定标准缩进策略,确保所有人以此行事。

8.缩进标记后的语句

除了缩进语句块内容外,还应缩进标记后的语句,让标记更易于阅读:

voidDoSomethingUseful(intarg)

{

loop:

for(intindex=0;index<=arg;index++)

{

switch(index)

{

case0:

//…

Break;//退出switch语句

defualt:

//…

Break;//退出switch语句

}

}

}

9.不用“硬”制表符

许多开发人员使用制表符(Tab)做缩进和代码对其,而没有意识到在不同环境中制表符会有不同解释。

在最初使用的编辑环境中看似正常的格式,迁移到以不同方式解释制表符的其他环境,或者由其他开发人员查看时,可能会显得毫无格式或极不可读。

要避免这种情况发生必须总是使用空格符,而不用制表符缩进和对齐源代码。

可以用空格键代替制表符键,也可以配置编辑器,使之自动用空格符代替制表符。

有些编辑器也具有“智能”缩进功能。

如果编辑器使用制表符做自动缩进,则应该禁止智能缩进功能。

10.切分长语句为多行语句

基于视窗的现代编辑器能够通过水平滚动条轻易处理长语句,但如果能在一屏内显示而不用滚动的话,开发人员阅读代码就会更有效率、更不不易出错。

另外,在超出最长打印行长度时,打印机会自动截断、换行或在另一张纸上打印代码。

要保证代码在打印出来后任可阅读,应将代码行限制在打印环境支持的最大长度内,通常会是80~132个字符。

首先,如果可能超出允许的最大长度,则不要把多个语句放在一行以内。

如果两个表达式语句放在同一行:

doublex=random.NextDouble();doubley=random.NextDouble();//太长!

就应该分成两行:

doublex=random.NextDouble();

doubley=random.NextDouble();

其次,如果行中包括复杂的表达式,导致一行过长:

Doubledistance=Math.Sqrt(Math.Pow((x1-x2),2.0)+

Math.Pow((y1-y2),2.0)+Math.Pow(z1-z2),2.0));

//太长

则将表达式清晰地分割为数个表达式。

在单独一个代码行中使用临时变量保存每个字表达式的运算结果:

doubledx=Math.Pow((x1-x2),2.0);

doubledy=Math.Pow((y1-y2),2.0);

doubledz=Maht.Pow(z1-z2),2.0);

doubledistance=Math.Sqrt(dx+dy-dz);

最后,如果长代码不能按照上述指导原则缩短,则采取以下规则切分、换行、和缩进代码。

第一步

如果行中最顶层表达式包含一个多个逗号:

doublevalue=Foo(Math.Pow(x,2.0),Math.Pow(y,2.0),Math.Pow(z,2.0));

则在每个逗号后换行。

将每个逗号后的表达式与该逗号前面表达式的第一个字符对齐:

doublevalue=Foo(Math.Pow(x,2.0),

Math.Pow(y,2.0),

Math.Pow(z,2.0));

第二步

如果行中最顶层表达式不包含逗号:

returnperson1.Name==person2.Name&&person1.Address==person2.Addess&&person1.Phone=person2.Phone;//太长

则在最低优先级的操作符之前换行;后者,如果有多个优先级相同的操作符,像这样对齐:

returnperson1.Name==person2.Name&&

person1.Address==person2.Address&&

person1.Phone==person2.Phone;

第三步

按需要重复进行第一步和第二步,直至从原始表达式语句转换而来的每一行代码都少于允许的最大长度。

2.2花括号

1.1按同一风格放置花括号

放置语句块左花括号的方式有两种,可以把左花括号放在控制语句块入口代码行的行尾,也可以放在下一行,使之和上行首字符对齐。

应当始终把右花括号单放一行,并使之与包含左花括号那行对齐:

voidSameLine(){

}

voidNextLine()

{

}

虽然许多程序员混用这两种方式,但你的组织应该二中选一,并且坚持使用。

本书适用第二种放置花括号的方式,下例展示了如果在不同c#定义和控制结构中应用此规则。

类声明

namespaceMyOrganization

{

publicclassOuter

{

publicOuter()

{

//…

}

publicclassInner

{

publicInner()

{

//…

}

}

}

方法声明

publicvoidDisplay()

{

//…

}

for循环语句

for(inti=0;i<=j;i++)

{

//…

}

if和else语句

if(j<0)

{

//…

}

elseif(j>0)

{

//…

}

else

{

//…

}

try块和catch块

try

{

//…

}

catch(…)

{

//…

}

finally

{

//…

}

switch语句

switch(value)

{

case0:

//…

break;

default:

//…

break;

}

while语句

while(++k<=j)

{

//…

}

do-while语句

do

{

//…

}while(++k<=j);

12.在流程控制结构中始终使用语句块

组合语句,或称语句块,提供了一种将一系列语句看作单个组合语句的机制。

不同的流程控制语句,如if…else、for、while和do…whle都能根据条件执行单个语句或语句块。

如果要在流程控制语句中根据条件执行多个语句,就必须使用块。

在嵌套使用if..else语句时,也可能需要使用块,避免常说的“悬挂else问题”这种可能的歧义情况出现。

if(x>=0)

If(x>0)Positive();

else//Oops!

匹配最近的if!

NegativeX();

下面的方式看似累赘,但逻辑流程却清晰易于维护:

if(x>=0)

{

if(x>0)

{

PositiveX();

}

else

{

//什么都不做…..

}

}

else

{

NegativeX();//这才是我们想要的!

}

使用语句块更便于往既有流程控制结构中添加新语句:

for(inti=n;i>=0;i++)

for(intj=0;j=n;j--)

Foo(i,j);

Goo(i,j);//为何i和j超出了作用域?

for(inti=n;i>=0;i++)

{

for(intj=0;j=n;j--)

{

Foo(i,j);

Goo(i,j);//这才是我们想要的!

}

}

2.3类的组织

13.在源文件开始分组放置using指示符

如果源文件中使用了using指示符,在文件开始分组放置这些指示符。

先依字母顺序列出系统定义的命名空间,后面加上一个空行;然后依字母顺序列出第三方命名空间,后面加上一个空行;最后再依字母顺序列出用户定义的命名空间:

usingSystem;

usingSystem.IO;

usingSystem.Xml;

usingCenterSpace.Nmath.Core;

usingCenterSpace.Nmath.Staus;

usingMyOrganization.BusinessUtilities;

14.将源代码组织到不同区域中

15.依可访问性排列类元素

16.单独声明每个变量和特性

第三章

命名

一致地使用一种命名约定,能给那些阅读代码的人留下极有价值的

直观线索。

本章给出一些命名约定,可以让代码更为可读。

3.1一般原则

17.使用有意义的名称

使用对读代码的人始终有意义的名称。

使用有意义的单词创建名称。

使用可被未来读者所理解的一致的语言。

避免使用单个字符或太一般性

的名称,那样对定义所命名的实体无所助益。

在下面的代码中,变量a和常量65的目的不清晰:

if(a<65)

{

//'a'的属性是什么?

//这里j正在计算什么?

}

else

{

y=0;

}

改用有意义的名称后,下面这段代码更易于理解:

if(age

{

yearsToRetirement=RetirementAge–age;

}

Else

{

yearsToRetirement=0;

}

 

本条规则的唯一例外是,当足以从上下文中判断出其目的时,可用简约方式命名临时变量,例如在循环内部用作计数器或索引的变散(讲规则47):

for(inti=0;i

{

EncrollStudent(i);

}

18.根据含意而非类型来命名

类型信息一般可从其用法利使用场景来推断出来。

有意义的名称才有用。

例如,使用Customer二而不用CustomerClass。

本条规则的一个例外是GUI控件的命名。

一有时,以名称来区分GUI元素的类型非常有用。

例如,区分customerNameLabel(窗体上的标记控件)和customerNameTextbox(窗体上的文本框控件)。

19.使用熟悉的名称

使用目标领域术语表中存在的单词。

如果用户喜欢用“customer(顾客)“,则用Custoemer命名类,而不用Client(客户)。

许多开发人员会错误地在目标行业或锁域中己存在常用术语时新创术语。

20.不要用大小写来区分名称

编译器能够区别仅大小写不同的名称,但人可能注意不到其差异。

这等同于名字隐藏(namehiding)。

例如,如果己经有名为XMLStream的类存在,就别将其他类命名为

XmlStrem。

假若两个类在同一作用城内出现,从人阅读和理解代码的角度来看,其中一个就会把另一个隐藏掉。

21.避免使用过长的名称

对象的名称应足以描述其目的。

如果类、接口、变量或方法的名称过长,则孩实体可能企图实现太多功能。

不要简单地用包含更少意义的名称重命名实体,首先要考虑其设计或目的二通过实体的重构可以得到功能更集中,用更简洁的名称即可涵括其意义的新类、新接口、新方法或新变量。

22.加上元音一使用完整的单词

切勿通过去除元音来缩短名称,这种做法降低了代码的可读性,如果有多个本来其有实际意义的名称被缩减为同一类形式,就会产生歧义。

下面的代码不好:

publicclassMsg

{

publicMsgAppendSig(stringsig)

{

….

}

}

 

最好改成:

publicclassMessage

{

publicMessageAppendSignature(stringsignature)

{

….

}

}

 

这样,偶然读到代码的人才能看懂后而的实现。

如果只为了缩短名称而去除元音,那么需要考虑一下原来的名称是否合适(见规则21)。

3.2缩略形式

23.除非全称太长,否到不用缩路形式

坚决不用不必要的缩略词迷惑人。

没有必要用Grph取代Graphical,但GuiListener比GraphicalUserInterfaceListener要好。

如果必须使用缩略词,就用广为使用和接受的缩略词。

24.像普通词一样书写缩略词

如果缩略词是类型或常量名称的首个单词,只大写缩略词的第一个字母。

当大写字母用作隔离符时,这种写法能消除名称称中的含混之处。

果缩略词后面还有一个缩略词时,这一点尤为重要:

XMLString>XmlString

LoadXMLDocument()>LoadXmlDocument()

条件编译指示符的名称中的缩略词不适用这一规则,因为这类名称只能用大写字母写出(见规则25):

[conditional(GUI)]

本规则不适用于在变里或参数名开始处的缩略词,因为这些名称总以小写字母开头:

DocumentxmlDocument;

3.3预处理器符号

25.用大写字母和下划线表示预处理器符号

用大写字母表示预处理器符号,使之与用C#语法定义的符号区分开来:

#defineEVAL_VERSION

26.给预处理器名称添加唯一前缀

给预处理器名称添加前缀,避免与用户定义或第三方软件中的预处理器名称相冲突。

建议使用你所在组织名称的缩略形式,可自行选择是否加上产品名称的缩略形式,例如ACME_DB_USER。

3.4类型和常量

27.使用Pascal写法给命名空间、类、结构、属性、枚举、常最及函数命名

每个单词的首字母大写,区分名称中每个独立的单词。

第一个字母大写提供了一种使其与参数或变量相区分的机制〔见规则43)。

publicenumBackgroundColor

{

None=0

Red=1,

Green=2.

Bule=3

};

constintFixedWidth=10;

classBankAccount

{

//…

}

PublicdoubleCalculatePercentitle(doublepercent)

{

//…

}

28.使用名词命名复合类型

应该用名词来命名定义了对象或其他事物的类、结构或属性:

publicclassCustomer

{

publicstringName

{

get

{

Returnname_;

}

}

}

29.用复数形式书写集合名称

对象集合的名称应该有能反映集合中对象的类型的复数形式,这样阅读你的代码的人才能区分表示多个值的变量和表示单个值的变量:

Listshapes=…

Shapeshape=shapes[index];

30.给抽象基类型加上“Base“后缀

清晰定义的基类更易于管理。

PublicabstractclassAccountBase

PublicclassPersonalAccount:

AccountBase

PublicclassBusinessAccount:

AccountBase

31.给实现一种设计模式的类添加模式名称

例如,名为MessageFactory的类对熟悉设计模式的开发人员来说有某种特定含义。

32.使用单个大写字母命名泛型参数

publicstaticListUnquify(List

{

//…

}

3.5枚举

33.用单数形式为枚举命名

枚举类型通常用于相互独立的元素组成的列表,应使用单数形式:

pubilcenumSortOrder

34.用复数形式给位域命名

位域通常用于可以组合形式出现的元素的列表,应使用复数形式:

[Flags]

publicenumPrintSettings

{

Draft=0,

Duplex=1.

Color=2

};

参见规则136。

3.6接口

35.用大写字母“|”作为接口名称的前缀

如果真的某个类是继承自父类还是实现一个接口,这就做会比较方便。

publicclassWorker:

Iworkable

36.使用名词或形容词给接口命名

接口声明了对象提供的服务,或描述了对象的能力。

使用

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1