3 回答
TA贡献1784条经验 获得超7个赞
在诸如“具有A,B,C,D”之类的病理条件之外,具有的最大危险是您的代码可以无提示地静默更改含义。考虑以下示例:
with TFoo.Create
try
Bar := Baz;
DoSomething();
finally
Free;
end;
您编写此代码时就知道Bar是TFoo的属性,而Baz是包含具有此代码的方法的类型的属性。
现在,两年后,一些好心的开发人员加入了TFoo的Baz属性。您的代码已默默地更改了含义。编译器不会抱怨,但是代码现在已损坏。
TA贡献1836条经验 获得超3个赞
在与关键字是使代码更易读一个不错的功能,但也有一些缺陷。
调试:
当使用这样的代码时:
with TMyClass.Create do
try
Add('foo');
finally
Free;
end;
无法检查此类的属性,因此请始终声明变量并在其上使用with关键字。
接口:
在with子句中创建接口时,它会一直存在到方法结束:
procedure MemoryHog;
begin
with GetInterfaceThatTakes50MBOfMemory do
Whatever;
ShowMessage('I''m still using 50MB of memory!');
end;
明晰
在with子句中使用具有在范围内已经存在的属性或方法名称的类时,它很容易使您蒙蔽。
with TMyForm.Create do
Width := Width + 2; //which width in this with is width?
当然,当名称重复时,您将使用在with语句(TMyForm)中声明的类的属性和方法。
TA贡献1836条经验 获得超4个赞
该with语句有它的位置,但是我必须同意,过度使用会导致代码不明确。一个好的经验法则是,在添加with语句之后,确保代码“更具”可读性和可维护性。如果您觉得需要在添加语句后添加注释以解释代码,则可能是个坏主意。如果您的示例中的代码更具可读性,请使用它。
顺便说一句:这一直是我在Delphi中最喜欢的显示模式窗口的模式之一
with TForm.Create(nil) do
try
ShowModal;
finally
Free;
end
添加回答
举报