猿问

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

我一直在阅读有关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;

  end

end;

没有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关键字吗?


慕斯709654
浏览 594回答 3
3回答

噜噜哒

在诸如“具有A,B,C,D”之类的病理条件之外,具有的最大危险是您的代码可以无提示地静默更改含义。考虑以下示例:with TFoo.Createtry  Bar := Baz;  DoSomething();finally  Free;end;您编写此代码时就知道Bar是TFoo的属性,而Baz是包含具有此代码的方法的类型的属性。现在,两年后,一些好心的开发人员加入了TFoo的Baz属性。您的代码已默默地更改了含义。编译器不会抱怨,但是代码现在已损坏。

米脂

在与关键字是使代码更易读一个不错的功能,但也有一些缺陷。调试:当使用这样的代码时:with TMyClass.Create dotry  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)中声明的类的属性和方法。

HUH函数

该with语句有它的位置,但是我必须同意,过度使用会导致代码不明确。一个好的经验法则是,在添加with语句之后,确保代码“更具”可读性和可维护性。如果您觉得需要在添加语句后添加注释以解释代码,则可能是个坏主意。如果您的示例中的代码更具可读性,请使用它。顺便说一句:这一直是我在Delphi中最喜欢的显示模式窗口的模式之一with TForm.Create(nil) dotry  ShowModal;finally  Free;end
随时随地看视频慕课网APP
我要回答