當將文件名參數傳遞給程序/函數時,是否應該使用TFilename
或String
。我應該使用String而不是TFilename嗎?
如果使用String
有什麼區別,它是什麼,那麼潛在的後果?
例如
procedure TForm1.OpenFile(const AFilename : String);
begin
//Open the file if it exists
...
end;
當將文件名參數傳遞給程序/函數時,是否應該使用TFilename
或String
。我應該使用String而不是TFilename嗎?
如果使用String
有什麼區別,它是什麼,那麼潛在的後果?
例如
procedure TForm1.OpenFile(const AFilename : String);
begin
//Open the file if it exists
...
end;
我覺得應該TFilename
開發組件時,可以使用,因爲這樣的IDE,可以顯示它的屬性編輯器(在屬性檢查器上的省略號點擊時TOpenDialog將顯示)。
除此之外,基本沒有區別使用哪一個。請記住,如果您使用TFilename
,則必須將SysUtils
添加到您的使用條款中。
在普通代碼中,string
和TFileName
類型之間的唯一實際區別在於通過引用傳遞參數;下面的代碼
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
也許這有點太明顯了編譯,但使用string
類型不傳達一個變量的預期使用任何東西。但是當你遇到一個聲明爲TFileName
的變量時,就會有更多的細節在那裏傳達。
同樣的原理applys其他基本類型,如Integer
,Cardinal
,Double
等相反,你可能要爲這些溝通更清晰的考慮使用別名,這些像TCustomerID
,THashValue
,TInterestRate
等什麼的,這些使用目的變量是。
這提高了可讀性,並且還允許在需要時更改基本類型,而無需使用類型觸及任何代碼......只需重新編譯即可完成(但要小心與二進制兼容的課程) 。
嗯,我有很強的偏好是const AFilename: String;
對於特別是對於較大的項目,如果你需要從另一個編碼器添加源代碼,如果他們使用了大量的自定義類型,如TCustomerID,THashValue,TInterestRate的原因,而不是整數,紅衣主教,雙,那麼你有很多上述E2033解決。
即使很多德爾福的內置源代碼不使用TFileName,如:
function MatchesMask(const Filename, Mask: string): Boolean;
而且如果我有這樣定義AFileName: TFileName;
一個變量,然後其明顯的一個文件名&指定的類型不加對我來說任何可讀性,如果在某些情況下它使得代碼更不可讀,因爲你必須點擊來檢查它從哪個實際變量派生而來。