2012-05-02 74 views
17

當將文件名參數傳遞給程序/函數時,是否應該使用TFilenameString我應該使用String而不是TFilename嗎?

如果使用String有什麼區別,它是什麼,那麼潛在的後果?

例如

procedure TForm1.OpenFile(const AFilename : String); 
begin 
    //Open the file if it exists 
    ... 
end; 

回答

20

我覺得應該TFilename開發組件時,可以使用,因爲這樣的IDE,可以顯示它的屬性編輯器(在屬性檢查器上的省略號點擊時TOpenDialog將顯示)。

除此之外,基本沒有區別使用哪一個。請記住,如果您使用TFilename,則必須將SysUtils添加到您的使用條款中。

10

在普通代碼中,stringTFileName類型之間的唯一實際區別在於通過引用傳遞參數;下面的代碼

procedure GetFileName(var FileName: TFileName); 
begin 
    FileName:= 'abcd.abc'; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
var 
    S: string; 

begin 
    GetFileName(S); 
end; 

不會錯誤

[DCC Error] E2033 Types of actual and formal var parameters must be identical 
2

也許這有點太明顯了編譯,但使用string類型不傳達一個變量的預期使用任何東西。但是當你遇到一個聲明爲TFileName的變量時,就會有更多的細節在那裏傳達。

同樣的原理applys其他基本類型,如IntegerCardinalDouble等相反,你可能要爲這些溝通更清晰的考慮使用別名,這些像TCustomerIDTHashValueTInterestRate等什麼的,這些使用目的變量是。

這提高了可讀性,並且還允許在需要時更改基本類型,而無需使用類型觸及任何代碼......只需重新編譯即可完成(但要小心與二進制兼容的課程) 。

1

嗯,我有很強的偏好是const AFilename: String; 對於特別是對於較大的項目,如果你需要從另一個編碼器添加源代碼,如果他們使用了大量的自定義類型,如TCustomerID,THashValue,TInterestRate的原因,而不是整數,紅衣主教,雙,那麼你有很多上述E2033解決。

即使很多德爾福的內置源代碼不使用TFileName,如:

function MatchesMask(const Filename, Mask: string): Boolean; 

而且如果我有這樣定義AFileName: TFileName;一個變量,然後其明顯的一個文件名&指定的類型不加對我來說任何可讀性,如果在某些情況下它使得代碼更不可讀,因爲你必須點擊來檢查它從哪個實際變量派生而來。

相關問題