有人知道 Delphi 2009 对“with”的处理有什么不同吗?
我昨天解决了一个问题,只是将“with”解构为完整引用,如“with Datamodule, Dataset, MainForm”。Delphi 2006 及更早的版本将“关闭”应用于数据集。Delphi 2009 对 MainForm 应用“关闭”并退出应用程序!
有人知道 Delphi 2009 对“with”的处理有什么不同吗?
我昨天解决了一个问题,只是将“with”解构为完整引用,如“with Datamodule, Dataset, MainForm”。Delphi 2006 及更早的版本将“关闭”应用于数据集。Delphi 2009 对 MainForm 应用“关闭”并退出应用程序!
什么也没有变。你之前的观察是错误的。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
. 它在调试和维护期间都会造成无穷无尽的麻烦,甚至可以由前一天编写代码的人执行维护。
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
的,会咬你一口**。
编译器通常非常可靠,因此在您真正排除其他所有内容之前,我不会假设存在错误或更改。我能很快想到的一些事情:
1)查看是否使用重载函数或运算符。由于 STRING(和其他几种类型)的定义发生了变化,因此可以选择不同的变体,因为签名有效地改变了。
2) 也可以是某些包含的单元现在定义了一个已经使用的标识符,并且优先于在不同单元中公开的标识符。
如果没有,请在一个最小的示例中开始隔离代码,使用尽可能少的单元。一步一步地做,因为诀窍是行为改变时的最后一次改变。
在此处发布(或 URL),它总是很有趣。
With..do是要小心使用。否则,这是一个无限的头痛来源......我同意 Rob Kennedy 和其他人的观点。
正如Craig Stuntz(在其他关于 with..do 的帖子中)和Lasse V. Karlsen上面所说的那样,with..do可以制造很多陷阱。