5

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

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

4

5 回答 5

16

什么也没有变。你之前的观察是错误的。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. 它在调试和维护期间都会造成无穷无尽的麻烦,甚至可以由前一天编写代码的人执行维护。

于 2009-07-15T09:10:25.403 回答
11

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

With 只能“安全地”用于永远不会改变的对象。如果您将它应用于您在自己的项目中定义的对象,那么所有的赌注都没有了,我敢说您应该只使用“if Random(50)<25”部分来执行您的代码,它至少被记录为奇怪地执行。

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

例如,假设你有这个:

with connection, file do
begin
    Close;
end;

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

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

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

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

于 2009-07-15T10:23:51.153 回答
3

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

于 2009-07-15T07:56:31.217 回答
3

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

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

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

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

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

于 2009-07-15T12:28:28.660 回答
1

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

正如Craig Stuntz在其他关于 with..do 的帖子中)和Lasse V. Karlsen上面所说的那样,with..do可以制造很多陷阱。

于 2009-07-15T12:40:56.073 回答