當我構建自定義組件時,我可能會實現發佈的持久性屬性。例如...發佈的持久性屬性 - 我應該使用FMyPersistent.Assign(Value)還是FMyPersistent:= Value?
type
TMyComponent = class(TComponent)
private
FMyPersistent: TMyPersistent;
...
public
...
published
property MyPersistent: TMyPersistent read FMyPersistent write SetMyPersistent;
...
end;
注意該過程SetMyPersistent
還沒有實現,這就是下一步的用武之地。我用鼠標右鍵單擊該對象並選擇「完整的類的光標」(或Shift + Control + C
)來調用代碼完成。當它自動創建此屬性setter,它會自動將分配代碼...
procedure TMyComponent.SetMyPersistent(const Value: TMyPersistent);
begin
FMyPersistent := Value;
end;
現在,這是不錯的,它繼續和完成了我這項任務。然而,在正常情況下,我總是習慣於用...
procedure TMyComponent.SetMyPersistent(const Value: TMyPersistent);
begin
FMyPersistent.Assign(Value);
end;
在財產是一種情況下,如String
或Integer
,然後直接分配是這樣做的正確方法。但是,在實施TPersistent
的已發佈財產時,是不是使用TPersistent.Assign
的正確方法?
使用這兩種賦值機制的本質區別是什麼?因爲如果使用TPersistent.Assign
是合適的事情,那麼代碼完成有一個小缺陷 - 也就是說,假設FMyPersistent := Value
被認爲是「錯誤的」。
你問你是否應該將內容分配給你自己的對象,而不是將對象替換爲另一個對象,並泄漏前一個對象?我想你可以自己解決這個問題!如果您的對象在其構造函數中創建了一個FMyPersistent,並將其釋放到其析構函數中,那麼請使用Assign,否則,如果它是弱引用,並且您沒有擁有該對象或釋放該對象,請使用變量FField:= Value。這都是關於所有權。 –
那麼我原來的問題標題就像是「爲什麼Cursor的Complete Class會直接分配已發佈的持久性屬性?」但是我改變了它,因爲它並不真正符合問題的核心。這真的很奇怪,爲什麼這個特定的實例會觸發IDE編寫一些不正確的代碼,只能讓你不得不更換它。我想知道爲什麼IDE會做這樣的事情,但這個問題當然會被認爲是無關緊要的。 –
@Jerry IDE的想法並不重要。它沒有大腦。你想要參考還是副本?這就是問題所在。你決定。 –