和OleVariant
一般不建议使用Variant和OleVariant。但是,当数据类型只有在运行期才知道时(常常是在COM和数据库应用程序中),这两个类型对编程就有必要。当进行诸如Automation、ActiveX控件的COM编程时,应当使用0leVariant;而对于非COM编程,则应当使用Variant。这是因为,Variant能够有效地保存
Delphi的原生字符串,而OleVariant则将所有字符串转换为OLE字符串(即WideChar字符串),且没有引用计数功能。
2.8 构造类型
2.8.1 数组类型
数组类型名应表达出该数组的用途。类型名必须加字母T为前缀。
如果要声明一个指向数组类型的指针,则必须加字母P为前缀,且声明在类型声明之前。例如:
type
PCycleArray = ^TCycleArray;
TCycleArray = array[1..100] of integer;
实际上,数组类型的变量实例与类型名称相同,但没有T前缀。
2.8.2 记录类型
记录类型名应表达出记录的用途。类型名必须加字母T为前缀。如果要声明一个指向记录类型的指计,则必须加字母P为前缀,且其声明在类型声明之前。例如:
type
PEmployee = ^TEmployee;
TEmployee = record
EmployeeName: string;
EmployeeRate: Double;
end;
2.9 语句
2.9.1 if语句
在if/then/else语句中,最有可能执行的情况应放在then子句中,不太可能的情况放在else子句中。
为了避免出现许多if语句,可以使用case语句代替。
如果多于5级,不要使用if语句。请改用更清楚的方法。
不要在if语句中使用多余的括号。
如果在if语句中有多个条件要测试,应按照计算的复杂程度从右向左排。这样,可以使代码充分利用编译器的短路估算逻辑。例如,如果Conditionl比Condition2快,Condition2比Condition3快,则if语句应这样构造:
if Condition1 and Condition2 and Condition3 then
如果无else子句且执行语句只有一句,该执行语句写在then后,例如:
if Condition then do some thing;
2.9.2 case语句
■ 概述
case语句中每种情况常量应当按数字或字母的顺序排列。
每种情况的动作语句应当简短且通常不超过4~5行代码。如果动作太复杂,应将代码单独放在一个过程或函数中。
case语句的else子句只用于默认情况或错误检测。
■ 格式
case语句遵循其他一般的缩进和命名规则。
2.9.3 while语句
建议不要使用Exit过程来退出whi1e循环。如果需要的话,应当使用循环条件退出循环。
所有对while循环进行初始化的代码应当位于while入口前,且不要被无关的语句隔开。
2.9.4 for语句
如果循环次数是确定的,应当用for语句代替while语句。
2.9.5 repeat语句
repeat语句类似于while循环,且遵循同样的规则。
2.9.6 with语句
■ 概述
with语句应小心使用。要避免过度使with语句,尤其是在with语句中使用多个对象或记录。例如:
with Record1, Record2 do
这些情况很容易迷惑编程人员,且导致检测bug困难。
■ 格式
with语句也遵循本章关于命名和缩进的规则。
2.10 结构化异常处理
2.10.1 概述
异常处理主要用于纠正错误和保护资源。这意味着,凡是分配资源的地方,都必须使用:try…finally来保证资源得到释放。不过,如果是在单元的initialization/finalization部分或者对象的构造/析构中来分配/释放资源则例外。
2.10.2 try…final1y的用法
可能的情况,每个资源分配应当与:try…finally结构匹配。例如,下面
代码可能导致错误:
SomeClassl := TSomeClass.Create;
SomeClass2 := TSomeClass.Create;
try
{do some code}
finally
SomeClass1.Free;
SomeClass2.Free;
end;
上述资源分配的一个安全途径是:
SomeClass1 := TSomeClass.Create;
try
SomeClass2 := TSomeClass.Create;
try
{do some code}
finally
SomeClass2.Free;
end;
finally
SomeClass1.Free;
end;
2.10.3 try…except的用法
如果您希望在发生异常