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
添加回答
舉報