你怎么写一个无操作声明?

时间:2011-09-24 01:58:50

标签: delphi coding-style noop

在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;

7 个答案:

答案 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块将允许您在不更改任何代码的情况下注释掉您的行。