第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么在訪問對(duì)象之前我不應(yīng)該使用“if Assigned()”?

為什么在訪問對(duì)象之前我不應(yīng)該使用“if Assigned()”?

為什么在訪問對(duì)象之前我不應(yīng)該使用“if Assigned()”?這個(gè)問題是stackoverflow上人們特別評(píng)論的延續(xù),我現(xiàn)在已經(jīng)看過幾次不同的時(shí)間了。我和教我Delphi的開發(fā)人員一樣,為了保證安全,if assigned()在釋放對(duì)象之前,以及在做其他各種事情之前總是先做檢查。但是,我現(xiàn)在被告知我不應(yīng)該添加此支票。我想知道如果我這樣做,應(yīng)用程序編譯/運(yùn)行的方式是否存在任何差異,或者它是否會(huì)對(duì)結(jié)果產(chǎn)生影響...if assigned(SomeObject) then SomeObject.Free;假設(shè)我有一個(gè)表單,我在表單創(chuàng)建時(shí)在后臺(tái)創(chuàng)建一個(gè)位圖對(duì)象,并在完成表單時(shí)釋放它?,F(xiàn)在我想我的問題是,當(dāng)我試圖訪問可能在某些時(shí)候可能已經(jīng)免費(fèi)的對(duì)象時(shí),我已經(jīng)習(xí)慣了對(duì)我的很多代碼進(jìn)行檢查。即使沒有必要,我也一直在使用它。我喜歡徹底......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現(xiàn)在讓我們說(shuō)我正在引入一個(gè)名為TMyList的新自定義列表對(duì)象TMyListItem。對(duì)于此列表中的每個(gè)項(xiàng)目,我當(dāng)然必須創(chuàng)建/釋放每個(gè)項(xiàng)目對(duì)象。創(chuàng)建項(xiàng)目有幾種不同的方法,以及一些銷毀項(xiàng)目的不同方法(添加/刪除是最常見的)。我確信將這種保護(hù)放在這里是一種非常好的做法......在許多情況下,至少我希望在我嘗試釋放它之前仍然創(chuàng)建對(duì)象。但是你永遠(yuǎn)不知道未來(lái)在對(duì)象被釋放之前會(huì)發(fā)生什么樣的滑動(dòng)。我總是使用這張支票,但現(xiàn)在我被告知我不應(yīng)該這樣,而且我仍然不明白為什么。
查看完整描述

3 回答

?
Helenr

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊

Free有一些特殊的邏輯:它檢查是否Selfnil,如果是這樣,它返回而不做任何事情-這樣你就可以安全地調(diào)用X.Free,即使Xnil。當(dāng)你編寫析構(gòu)函數(shù)時(shí),這很重要 - 大衛(wèi)在他的答案中有更多的細(xì)節(jié)。

您可以查看源代碼Free以了解其工作原理。我沒有方便的Delphi源代碼,但它是這樣的:

procedure TObject.Free;begin
  if Self <> nil then
    Destroy;end;

或者,如果您愿意,可以將其視為等效代碼,使用Assigned

procedure TObject.Free;begin
  if Assigned(Self) then
    Destroy;end;

您可以編寫自己的方法來(lái)檢查if Self <> nil,只要它們是靜態(tài)(即,不是virtualdynamic)實(shí)例方法(感謝David Heffernan的文檔鏈接)。但是在Delphi庫(kù)中,Free我所知道的唯一方法是使用這個(gè)技巧。

因此,Assigned在調(diào)用之前,您無(wú)需檢查變量是否存在Free; 它已經(jīng)為你做到了。這就是為什么建議是調(diào)用Free而不是Destroy直接調(diào)用的原因:如果你在nil引用上調(diào)用了Destroy ,你就會(huì)遇到訪問沖突。


查看完整回答
反對(duì) 回復(fù) 2019-08-17
  • 3 回答
  • 0 關(guān)注
  • 680 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)