为什么在访问对象之前我不应该使用“if Assigned()”?
这个问题是stackoverflow上人们特别评论的延续,我现在已经看过几次不同的时间了。我和教我Delphi的开发人员一样,为了保证安全,if assigned()
在释放对象之前,以及在做其他各种事情之前总是先做检查。但是,我现在被告知我不应该添加此支票。我想知道如果我这样做,应用程序编译/运行的方式是否存在任何差异,或者它是否会对结果产生影响...
if assigned(SomeObject) then SomeObject.Free;
假设我有一个表单,我在表单创建时在后台创建一个位图对象,并在完成表单时释放它。现在我想我的问题是,当我试图访问可能在某些时候可能已经免费的对象时,我已经习惯了对我的很多代码进行检查。即使没有必要,我也一直在使用它。我喜欢彻底......
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private FBitmap: TBitmap; public function LoadBitmap(const Filename: String): Bool; property Bitmap: TBitmap read FBitmap; end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);begin FBitmap:= TBitmap.Create; LoadBitmap('C:\Some Sample Bitmap.bmp');end;procedure TForm1.FormDestroy(Sender: TObject);begin if assigned(FBitmap) then begin //<----- //Do some routine to close file FBitmap.Free; end;end;function TForm1.LoadBitmap(const Filename: String): Bool;var EM: String; function CheckFile: Bool; begin Result:= False; //Check validity of file, return True if valid bitmap, etc. end;begin Result:= False; EM:= ''; if assigned(FBitmap) then begin //<----- if FileExists(Filename) then begin if CheckFile then begin try FBitmap.LoadFromFile(Filename); except
现在让我们说我正在引入一个名为TMyList
的新自定义列表对象TMyListItem
。对于此列表中的每个项目,我当然必须创建/释放每个项目对象。创建项目有几种不同的方法,以及一些销毁项目的不同方法(添加/删除是最常见的)。我确信将这种保护放在这里是一种非常好的做法......
在许多情况下,至少我希望在我尝试释放它之前仍然创建对象。但是你永远不知道未来在对象被释放之前会发生什么样的滑动。我总是使用这张支票,但现在我被告知我不应该这样,而且我仍然不明白为什么。
Helenr