亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 651 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號