我听过很多程序员,特别是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