Page 7
CodeExample *pFirst, pSecond;
这种误写实际上等同于:
CodeExample *pFirst; CodeExample pSecond;
2.6 函数的声明和调用
函数或方法的名称,返回值,参数列表可以有多种形式。原则上应该都将这些置于同一行代码内。如果带有过多参数不能置于一行代码,可以进行换行:多个参数一行或者一个参数一行。将返回值置于函数或方法名称的同一行。例如,
单行格式:
// C++ function declaration sample:
HRESULTDoSomeFunctionCall(intparam1, intparam2, int *param3); // C++ / C# function call sample:
hr = DoSomeFunctionCall(param1, param2, param3); 'VB.NETfunction call sample:
hr = DoSomeFunctionCall(param1, param2, param3)
多行格式:
// C++ function declaration sample:
HRESULT DoSomeFunctionCall(intparam1, intparam2,int *param3, intparam4, intparam5);
// C++ / C# function call sample:
hr = DoSomeFunctionCall(param1, param2,param3, param4, param5);
'VB.NETfunction call sample:
hr = DoSomeFunctionCall(param1, param2,param3, _ param4, param5)
将参数列表置于多行代码时,每一个参数应该整齐排列于前一个参数的下方。第一个类型/参数对置于新行行首,并缩进一个制表符宽度。函数或方法调用时的参数列表同样需按照这一格式。
// C++sample:
HRESULT DoSomeFunctionCall(
? 2015 Microsoft Corporation. All rights reserved. All-In-One Code Framework (http://1code.codeplex.com)
Page 8
HWND hwnd, // You can comment parameters, too T1 param1, // Indicates something T2 param2, // Indicates something else T3 param3, // Indicates more T4 param4, // Indicates even more T5 param5); // You get the idea
// C++ / C# sample: hr = DoSomeFunctionCall( hwnd, param1, param2, param3, param4, param5);
'VB.NETsample:
hr = DoSomeFunctionCall( _ hwnd, _ param1, _ param2, _ param3, _ param4, _ param5)
?一定请将参数排序,并首先将输入参数分组,再将输出参数放置最后。在参数组内,按照能够帮助程序员输入正确值的原则来将参数排序。比如,如果一个函数带有2个参数, “left” 和 “right”,将 “left” 置于 “right” 之前,则它们的放置顺序符合其参数名。当设计一系列具有相同参数的函数时,在各函数内使用一致的顺序。比如,如果一个函数带有一个输入类型为句柄的参数作为第一参数,那么所有相关函数都应该将该输入句柄作为第一参数。
2.7 代码语句
?一定不要在同一行内放置一句以上的代码语句。这会使得调试器的单步调试变得更为困难。
Good:
// C++ / C#sample: a = 1; b = 2;
' VB.NETsample:
? 2015 Microsoft Corporation. All rights reserved. All-In-One Code Framework (http://1code.codeplex.com)
Page 9
If(IsAdministrator())Then Console.WriteLine(\) EndIf
Bad:
// C++ /C#sample: a = 1; b = 2;
' VB.NET sample:
If(IsAdministrator())Then Console.WriteLine(\)
2.8 枚举
?一定请将代表某些值集合的强类型参数,属性和返回值声明为枚举类型。
?一定请在合适的情况下尽量使用枚举类型,而不是静态常量或 “#define” 值。枚举类型是一个具有一个静态常量集合的结构体。如果遵守这些规范,定义枚举类型,而不是带有静态常量的结构体,您便会得到额外的编译器和反射支持。
Good:
// C++ sample: enum Color {
Red, Green, Blue };
// C# sample: publicenumColor {
Red, Green, Blue }
' VB.NET sample: PublicEnum Color Red Green Blue EndEnum
? 2015 Microsoft Corporation. All rights reserved. All-In-One Code Framework (http://1code.codeplex.com)
Page 10
Bad:
// C++ sample: constintRED= 0; constintGREEN = 1; constintBLUE=2;
#define RED 0 #define GREEN 1 #define BLUE 2
// C# sample:
publicstaticclassColor {
publicconst int Red = 0; publicconst int Green = 1; publicconst int Blue = 2; }
' VB.NET sample: PublicClass Color
PublicConst Red AsInteger = 0 PublicConst Green AsInteger = 1 PublicConst Blue AsInteger = 2 EndClass
?一定不要使用公开集合作为枚举(例如操作系统版本,您亲朋的姓名)。
?一定请为简单枚举提供一个0值枚举量,可以考虑将之命名为“None”。如果这个名称对于特定的枚举并不合适,可以自行定义为更准确的名称。
// C++ sample: enumCompression {
None = 0, GZip, Deflate };
// C# sample:
publicenumCompression {
None = 0, GZip, Deflate
? 2015 Microsoft Corporation. All rights reserved. All-In-One Code Framework (http://1code.codeplex.com)
Page 11
}
' VB.NET sample: PublicEnum Compression None = 0 GZip Deflate EndEnum
?一定不要在.NET中使用 Enum.IsDefined 来检查枚举范围。Enum.IsDefined有2个问题。首先,它加载反射和大量类型元数据,代价极其昂贵。第二,它存在版本的问题。
Good:
// C# sample:
if(c >Color.Black || c thrownewArgumentOutOfRangeException(...); } ' VB.NET sample: If(c > Color.Black Or c < Color.White)Then ThrowNew ArgumentOutOfRangeException(...); EndIf Bad: // C# sample: if(!Enum.IsDefined(typeof(Color), c)) { thrownew InvalidEnumArgumentException(...); } ' VB.NET sample: IfNot [Enum].IsDefined(GetType(Color), c)Then ThrowNew ArgumentOutOfRangeException(...); EndIf 2.8.1 标志枚举 标志枚举用于对枚举值进行位运算的支持。标志枚举通常用于表示选项。 ?一定要将 System.FlagsAttribute 应用于标志枚举。一定不要将此属性用于简单枚举。 ? 2015 Microsoft Corporation. All rights reserved. All-In-One Code Framework (http://1code.codeplex.com)