在Delphi中编写无操作语句的最佳方法是什么?
取此代码:
if a=b then
SomeOldStatement
else
AnotherStatement;
并说您暂时想删除SomeOldStatement
。
你会选择这个解决方案吗:
if a=b then
//SomeOldStatement
else
AnotherStatement;
就我个人而言,我不喜欢空的then
部分,我想在那里有可编译的东西。。。
if a=b then
NoOp
//SomeOldStatement
else
AnotherStatement;
根本不知道你为什么需要那里的任何东西(例如,我对"then else"很满意(。
但如果你想在那里买到什么,我会这样做:
if a=b then
begin end
//SomeOldStatement
else
AnotherStatement;
一个空的开始块是我所知道的Delphi中最好的地方。它不会产生汇编代码,因此不会产生任何开销。
if a=b then
SomeOldStatement
else
AnotherStatement;
应该写成
if a=b then
begin
SomeOldStatement;
end
else
begin
AnotherStatement;
end;
现在,您可以评论SomeOldStatement;有了你想要的效果,调试器可以更准确地跟踪代码流,并且可以避免像这样的代码中出现奇怪的副作用
if a=b then
if b=c then
statement1
else
if c=d then
statement2;
else
statement2
else
statement3;
搞砸了你的缩进,把分号弄错了,把一行文档写出来进行测试和胡说八道,事情很快就会变得很糟糕。
说真的,试着弄清楚我刚刚在那里写的代码在没有编译器通过的情况下是否有效
现在,猜猜这个会发生什么:
if a=b then
if b=c then
statement1
else
if c=d then
statement2;
// else
statement2
else
statement3;
还有:
if a=b then
statement1;
statement2;
经常会做一些奇怪的事情,甚至在做时会做一些陌生的事情
if a=b then
// statement1;
statement2;
严肃的——只要养成在所有逻辑中总是有开始-结束的习惯——这会让你的代码更容易理解,避免副作用,避免心理分析错误、代码分析错误和注释出副作用。
另外,空的开始/结束和你的否是一样的。
在Delphi 2005及后续版本中,可以定义一个NoOp
空过程并将其标记为inline
。
这样,除非定义{$INLINE OFF}
或在编译器选项中将代码内联控件设置为关闭,否则不会生成任何代码。
procedure NoOp; inline;
begin
// do nothing
end;
生成的代码非常干净:
if a=b then
NoOp //SomeOldStatement
else
AnotherStatement;
这是最好的选择。我广泛使用它进行调试,因为我可以在那里放置断点,不依赖于另一个单元,不会以任何方式干扰程序,而且比条件断点快得多。
if a=b then
asm nop end
else
AnotherStatement;
你可以使用类似a:=a
的东西,但老实说,我发现即使比非语句更丑陋,你也应该编写代码,让后面的人理解你的意图,而命令a:=a
并没有真正遵循这一准则。
由于这只是一个临时的东西,我只想假设你没有可执行代码。如果,正如你所说,Delphi仍然编译得很好,你就没有问题了。
如果您想要一些代码用于断点,并且没有更好的方法,我会考虑暂时执行a:=a
。
如果这将是一个更永久的改变,你可以考虑反转条件,这样你就没有空块了:
if not (a = b) then
AnotherStatement;
或者,更好的是:
if a <> b then
AnotherStatement;
分配怎么样,a := a
?这是个禁忌。
(我不知道Delphi,所以赋值的语法可能是错误的,但希望你能理解这个想法,并在需要时更正语法(
如果没有begin end
块的语句是一个等待发生的错误,在这种情况下添加begin end
块将允许您在不更改任何代码的情况下注释掉您的行。