微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我不应该在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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐