为什么在访问对象之前我不应该使用“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
相关分类