为了账号安全,请及时绑定邮箱和手机立即绑定

Delphi“ with”关键字是一种不好的做法吗?

Delphi“ with”关键字是一种不好的做法吗?

慕斯709654 2019-12-04 14:43:10
我一直在阅读有关delphi中with关键字的坏东西,但我认为,如果您没有过度使用它的话。它可以使您的代码看起来很简单。我经常将所有TClientDataSets和TFields放入TDataModules中。所以在我的表单中,我有这样的代码procedure TMyForm.AddButtonClick(Sender: TObject);begin    with LongNameDataModule do  begin     LongNameTable1.Insert;     LongNameTable1_Field1.Value := "some value";     LongNameTable1_Field2.Value := LongNameTable2_LongNameField1.Value;     LongNameTable1_Field3.Value := LongNameTable3_LongNameField1.Value;     LongNameTable1_Field4.Value := LongNameTable4_LongNameField1.Value;     LongNameTable1.Post;  endend;没有with关键字,我必须编写这样的代码    procedure TMyForm.AddButtonClick(Sender: TObject);    begin                  LongNameDataModule.LongNameTable1.Insert;      LongNameDataModule.LongNameTable1_LongNameField1.Value := "some value";      LongNameDataModule.LongNameTable1_LongNameField2.Value :=               LongNameDataModule.LongNameTable2_LongNameField1.Value;      LongNameDataModule.LongNameTable1_LongNameField3.Value :=               LongNameDataModule.LongNameTable3_LongNameField1.Value;      LongNameDataModule.LongNameTable1_LongNameField4.Value :=               LongNameDataModule.LongNameTable4_LongNameField1.Value;      LongNameDataModule.LongNameTable1.Post;    end;我认为使用with关键字更容易阅读。我应该避免使用with关键字吗?
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

在诸如“具有A,B,C,D”之类的病理条件之外,具有的最大危险是您的代码可以无提示地静默更改含义。考虑以下示例:


with TFoo.Create

try

  Bar := Baz;

  DoSomething();

finally

  Free;

end;

您编写此代码时就知道Bar是TFoo的属性,而Baz是包含具有此代码的方法的类型的属性。


现在,两年后,一些好心的开发人员加入了TFoo的Baz属性。您的代码已默默地更改了含义。编译器不会抱怨,但是代码现在已损坏。


查看完整回答
反对 回复 2019-12-04
?
米脂

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)中声明的类的属性和方法。


查看完整回答
反对 回复 2019-12-04
?
HUH函数

TA贡献1836条经验 获得超4个赞

该with语句有它的位置,但是我必须同意,过度使用会导致代码不明确。一个好的经验法则是,在添加with语句之后,确保代码“更具”可读性和可维护性。如果您觉得需要在添加语句后添加注释以解释代码,则可能是个坏主意。如果您的示例中的代码更具可读性,请使用它。


顺便说一句:这一直是我在Delphi中最喜欢的显示模式窗口的模式之一


with TForm.Create(nil) do

try

  ShowModal;

finally

  Free;

end


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 539 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信