【问题标题】:Delphi 2009 Handling of WithDelphi 2009 处理 With
【发布时间】:2010-11-10 22:14:15
【问题描述】:

有人知道 Delphi 2009 对“with”的处理有什么不同吗?

我昨天解决了一个问题,只是将“with”解构为完整引用,例如“with Datamodule, Dataset, MainForm”。 Delphi 2006 及更早的版本将“关闭”应用于数据集。 Delphi 2009 对 MainForm 应用“关闭”并退出应用程序!

【问题讨论】:

  • +1 精心设计的问题可以引出一些真正优秀的答案!

标签: delphi delphi-2009 with-statement


【解决方案1】:

什么都没有改变。你之前的观察是错误的。 with 语句中提到的对象被认为是“从右到左”,因此在您的示例中,将首先搜索 MainForm,然后是 Dataset,然后是 Datamodule。一直都是这样。就像你写的一样:

with Datamodule do
  with Dataset do
    with MainForm do begin
      Close;
    end;

继续查看 Delphi 2006 文档;应该有一个名为 Declarations and statements 的部分,您将在其中找到 Structured statements,包括关于 With statements 的部分。

帮自己一个忙,不要使用with。它在调试和维护期间都会造成无穷无尽的麻烦,甚至可以由前一天编写代码的人执行维护。

【讨论】:

  • 嗯...我检查了 2006 年 2 月 7 日版本的单元与 2009 年 6 月 2 日的版本,我确实添加了 MainForm。所以D2006毕竟没有什么不同。
  • 那么推荐什么?如果使用“with DBComponent.DataSource.DataSet”,是否应该引入一个局部变量来保存引用?
  • 是的,@Larry。例如:var dset: TDataset; dset := DBComponent.DataSource.Dataset; dset.foo; dset.bar;
  • 呃!对我来说变化很大。那好吧。 . .
【解决方案2】:

With 是邪恶的。我不知道我需要说多少次,但显然我们还没有。

With 只能“安全地”用于永远不会改变的对象。如果您将它应用于您在自己的项目中定义的对象,那么所有的赌注都没有了,我敢说您应该只使用“if Random(50)

问题在于,一旦你开始弄乱一个对象,引入新的方法或属性,或者重命名旧的,所有使用这些方法的现有with-statements 都有可能改变含义。而不是在“警告:调用模棱两可的方法”中的变化。代码只会做一些与以前不同的事情。不告诉你。

例如,假设你有这个:

with connection, file do
begin
    Close;
end;

那么你期望会发生什么?好吧,关闭文件是很自然的,所以我希望文件被关闭。让我们进一步假设这个文件变量包含一个 TSomeOddFile 类型的对象,它没有定义 Close 方法,而是一个 CloseFile 方法。然后上面的 With 语句将关闭连接。

一切都好,它已记录在案,没有人编写这段代码认为文件会被关闭,毕竟,该方法为该对象命名为 CloseFile,这只是我的假设是错误的,我不工作项目。然而。

然后有人解决了这个问题,将 CloseFile 重命名为 Close。上面的代码将默默地开始关闭文件而不是连接。没有警告,没有错误,编译和更改方法名称之前一样好。运行正常^h^h^h,不用等待,它不会。

所以,是的,with 会咬你一口**。

【讨论】:

  • +1,有时只能靠经验来体会。
  • 嗯,学习应该通过被告知经验来发挥作用,这样你就不必自己经历了。 WITH 为我烧了这么多小时,直到我发现一堆热气腾腾的……真的是。
【解决方案3】:

使用with A,B,C,D 是不好的做法,因为对其他单元的更改可能会突然导致您的代码停止按预期工作。更多信息请参见here,或here(搜索"with keyword")。

【讨论】:

    【解决方案4】:

    编译器通常非常可靠,因此在您真正排除其他所有内容之前,我不会假设存在错误或更改。我能很快想到的一些事情:

    1) 看看你是否使用了重载的函数或运算符。由于 STRING(和其他几种类型)的定义发生了变化,因此可以选择不同的变体,因为签名有效地发生了变化。

    2) 也可能是某些包含的单元现在定义了一个已使用的标识符,并且优先于在不同单元中公开的标识符。

    如果没有,请在最小示例中开始隔离代码,使用尽可能少的单元。一步一步地做,因为诀窍是行为改变时的最后一次改变。

    在此处发布(或 URL),它总是很有趣。

    【讨论】:

    • +1 用于实际回答问题,而不是重复不应该使用 with 语句。
    【解决方案5】:

    With..do 要小心使用。否则,是一个无限的头痛来源......我同意 Rob Kennedy 和其他人的观点。

    正如上面Craig Stuntz(in other post about with..do)和Lasse V. Karlsen所说,with..do可以制造很多陷阱。

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2011-05-28
      • 1970-01-01
      相关资源
      最近更新 更多