为什么我不应该在Delphi中使用“with”?

我听过很多程序员,特别是Delphi程序员鄙视使用’with’。

我以为它使程序运行速度更快(只有一个对父对象的引用),而且如果使用明智(不到十几行代码,没有嵌套),读取代码更容易。

以下是一个例子:

procedure TBitmap32.FillRectS(const ARect: TRect; Value: TColor32);
begin
  with ARect do FillRectS(Left,Top,Right,Bottom,Value);
end;

我喜欢用。我怎么了?

解决方法

使用它的一个烦恼是调试器无法处理它。所以它使调试更加困难。

更大的问题是读取代码并不容易。特别是如果with语句有点长。

procedure TMyForm.ButtonClick(...)
begin
  with OtherForm do begin
    Left := 10;
    Top := 20;
    CallThisFunction;
  end;
end;

哪个Form的CallThisFunction将被调用? Self(TMyForm)或OtherForm?您不能在不检查OtherForm是否具有CallThisFunction方法的情况下知道。

最大的问题是你可以使bug很容易,甚至不知道。如果TMyForm和OtherForm都有一个CallThisFunction,但它是私有的。你可能会希望/想要调用OtherForm.CallThisFunction,但实际上并不是这样。编译器会警告你,如果你没有使用,但现在它没有。

使用多个对象来增加问题。见http://blog.marcocantu.com/blog/with_harmful.html

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...