在Delphi中编写no-op statement的最佳方法是什么?
拿这段代码:
if a=b then
SomeOldStatement
else
AnotherStatement;
并说你暂时想要取出SomeOldStatement
。
你会选择这个解决方案吗?
if a=b then
//SomeOldStatement
else
AnotherStatement;
就我个人而言,我不喜欢空的then
部分,并且希望某些可以在那里编译...
if a=b then
NoOp
//SomeOldStatement
else
AnotherStatement;
答案 0 :(得分:14)
不确定为什么你根本不需要任何东西(例如我对“其他”感到满意)。
但如果你想在那里编写可编辑的内容,我会这样做:
if a=b then
begin end
//SomeOldStatement
else
AnotherStatement;
一个空的开始块是我在Delphi中知道的最好的noop。它不会产生汇编代码,因此不会产生任何开销。
答案 1 :(得分:12)
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;
严肃 - 只要养成总是在你的所有逻辑中开始结束的习惯 - 它使你的代码更容易遵循,避免副作用,避免心理解析错误,代码解析错误和注释掉副作用。
另外,空的开始/结束与你的无操作相同。
答案 2 :(得分:6)
在Delphi 2005及后续版本中,您可以定义NoOp
空过程并将其标记为inline
。
这样,除非您在编译器选项中定义{$INLINE OFF}
或将代码内联控件设置为关闭,否则不会生成任何代码。< / p>
procedure NoOp; inline;
begin
// do nothing
end;
结果代码非常干净:
if a=b then
NoOp //SomeOldStatement
else
AnotherStatement;
答案 3 :(得分:3)
你可以使用a:=a
这样的东西,但说实话,我发现甚至 uglier 而不是非陈述 - 你应该编码以便那些跟在你后面的人会理解您的意图,命令a:=a
并不真正遵循该指南。
由于这只是一个临时的东西,我只是觉得你没有可执行代码。如果像你说的那样,德尔福仍然可以很好地编译它,你就没有问题。
如果你想要一些断点的代码,并且没有更好的方法,我会考虑暂时执行a:=a
。
如果这是一个更持久的变化,你可以改为考虑条件的逆转,以便你根本没有空块:
if not (a = b) then
AnotherStatement;
或者,更好的是:
if a <> b then
AnotherStatement;
答案 4 :(得分:2)
如何分配a := a
?这是一个无操作。
(我不知道Delphi,因此赋值的语法可能是错误的,但希望你能得到这个想法并在需要时纠正语法)
答案 5 :(得分:2)
这是最好的选择。我广泛使用它进行调试,因为我可以在那里放置一个断点,不依赖于另一个单元,不会以任何方式干扰你的程序,并且比条件断点快得多。
if a=b then
asm nop end
else
AnotherStatement;
答案 6 :(得分:1)
如果没有begin end
块的语句是等待发生的错误,在这种情况下,添加begin end
块将允许您在不更改任何代码的情况下注释掉您的行。