use*_*603 5 delphi delphi-2009 with-statement
有人知道Delphi 2009处理"with"有什么不同吗?
我昨天解决了一个问题,只需将"with"解构为完整引用,如"with Datamodule,Dataset,MainForm".Delphi 2006及更早版本对数据集应用了"Close".Delphi 2009对MainForm应用了"Close"并退出了应用程序!
Rob*_*edy 16
什么也没有变.你先前的观察是错误的.在提到的对象with声明被认为是"从右至左",让您的示例中,MainForm将搜索的第一个,然后Dataset,然后Datamodule.这就是它一直以来的方式.就像你写这个一样:
with Datamodule do
with Dataset do
with MainForm do begin
Close;
end;
Run Code Online (Sandbox Code Playgroud)
继续查看Delphi 2006文档; 应该有一个名为声明和语句的部分,您可以在其中找到结构化语句,包括With语句部分.
帮个忙,不要用with.它在调试期间和维护期间都不会导致故障,即使前一天编写代码的人员也可以进行维护.
ang*_*son 11
With是邪恶的.我不知道有多少次我需要说这个,但显然我们还没有.
只能"安全地"使用永远不会改变的对象.如果你把它应用到你在你自己的项目中定义的对象,所有的赌注都是关闭的,我敢说你应该只使用"如果随机(50)<25"部分来执行你的代码,它至少会被记录为奇怪的执行.
问题是,一旦你开始搞乱一个对象,引入新方法或属性,或重命名旧方法,所有with使用这些方法的现有语句都有可能改变意义.而不是在"警告:呼吁模糊方法"改变.代码将只执行以前的其他操作.没有告诉你它.
例如,我们假设你有这个:
with connection, file do
begin
Close;
end;
Run Code Online (Sandbox Code Playgroud)
那你期望发生什么?好吧,关闭文件是很自然的,所以我希望文件能够关闭.让我们进一步假设这个文件变量包含一个TSomeOddFile类型的对象,该对象没有定义Close方法,而是一个CloseFile方法.然后,上面的With语句将关闭连接.
一切都很好,据记载,没有人写这段代码认为文件将被关闭,毕竟,该方法被命名为CloseFile的对象,这只是我的假设是错误的,我没有在项目上工作.然而.
然后有人修复了这个问题,将CloseFile重命名为Close.上面的代码将默默地开始关闭文件而不是连接.没有警告,没有错误,编译就像更改方法名称之前一样好.运行一样精细^ h ^ h ^ h,不等待,它不会.
所以是的,with会在a**中咬你.