在 Delphi 10.3.3应用程序中工作,有大量的额外和缺失的分号。如果在任何块结束语句之前删除分号,则应用程序将编译。
在代码中,[except]和[end]之间的浮点分号是否有任何用途,例如加快运行速度或抛出某个默认异常,或者有其他用途?
这会引发随机编译或运行时错误吗?
在end或except之前的最后一行中保留分号是否会加快运行时速度?
一种方法是否比另一种方法更容易出错,或者是否容易出现随机编译或运行时错误?
下面的代码可以拖放到任何测试项目中,该项目的窗体具有一个编辑框、一个按钮和一个用拖放默认设置创建的备忘录框。
function TForm1.isThisUseful(this : string): boolean;
var
i: Integer;
begin
result := false;
try
if this = ''
then
i := 0
else
i := 1
except
;
end;
result := (i > 0)
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if isThisUseful(Edit1.Text)
then
Memo1.Text := 'Yes, it is useful'
else
Memo1.Text := 'This is a waste of time.'
end;
4条答案
按热度按时间dluptydi1#
tl;dr:没有任何区别。
这个分号可以被删除。它绝对没有任何作用。它没有好处,也没有坏处(除了,可能,它使源代码看起来很奇怪,这是你应该避免的1)。
因为在 Delphi 中,分号 * 分隔 * 语句,所以
end
前面的最后一个分号是不必要的。它绝对没有任何作用。它主要是一个品味的问题,如果你想要它或不(就我个人而言,有时有,有时没有)。使用分号的一个好处是,你可以将这一行移动或复制到其他地方,而不必修改它。同样,你也可以在这一行代码后面插入一个新的语句,而不需要添加分号。恕我直言,这些都是非常小的好处;在必要时添加分号并不困难。
result := (i > 0)
对我来说确实很奇怪。我希望是Result := i > 0
,没有不必要的括号。(这可能是因为我几乎每天都用 Delphi 编程,已经超过20年了。)它只是忽略了多余的分号。但是上面的代码片段在我看来 * 非常 * 难看,而且我总是觉得很奇怪,开发人员选择提交代码而不先阅读它。
1在这种情况下,你也可以说分号是有用途的:它“突出显示”了空的
except
块,使其更容易被快速发现。因此,它可能是有意的。但有人可能会争辩说,突出显示它的更好方法是包含一个像// Do nothing
或// Just carry on
这样的注解。(而且,在许多情况下,如果不是大多数情况下,空的except
块一点也不好。)roejwanj2#
我想我会尝试一些测量,在这个D7测试程序上使用NexusDB's Quality Suite的线路定时器:
其中包含问题中
isThisUseful
函数的两个版本,一个在except
块中带有分号,另一个不带分号。运行此代码的结果(抱歉,布局有点混乱)如下所示:请注意,第21行(
try ...except
块中的分号)没有记录时间,原因很简单,正如预期的那样,没有为它生成代码。为了完整起见,以下是
isThisUseful1
和isThisUseful2
的反汇编这是否有用1:
这是否有用2:
(我自己也在试图比较这些数据,我不想浪费时间在BeyondCompare上运行它们)。
无论如何,我认为这表明,正如我和其他人所说的,编译器不会为
try...except
块中只包含分号的行生成代码,也不应该在其他任何地方生成代码,尽管正如所指出的,存在或不存在分号会改变代码的语义,从而改变生成的代码。oknwwptz3#
除了安德烈亚斯的回答......
有一种情况,你肯定(或者,至少,最有可能)不想在“then”后面留下分号。下面的代码将在消息框中显示“B”。
在我看来,这是唯一一种插入分号会自行更改代码代的情况。
sr4lhrrt4#
感谢大家对这篇文章的反馈。我想总结一下几点。
分号改变了应用程序编译的方式。因此,应用程序的大小可以改变很小的量。所以,它看起来像是应用程序中的硬终止符或分支切换终止符。也就是说,它可能应该在每个Try的末尾,除了end;在每个except或finally之前,以及在每个循环的末尾,无论后面的内容如何,都要确保编译干净且一致。
但不应该是另一个[end]语句之前的if-[end]语句中缺少的一个问题,或者是在没有其他代码存在的地方作为一个附加项。但可能在循环中多加一个分号,这不是最好的主意。