将文件名参数传递给过程/函数时,我应该使用TFilename
还是String
。
如果存在差异,它是什么,以及如果使用String
会产生什么后果呢?
e.g。
procedure TForm1.OpenFile(const AFilename : String);
begin
//Open the file if it exists
...
end;
答案 0 :(得分:20)
我认为在开发组件时应该使用TFilename
,因为这样IDE可以显示它的属性编辑器(在属性检查器中单击省略号时将显示TOpenDialog)。
除此之外,使用哪个基本没有区别。请记住,如果您使用TFilename
,则必须将SysUtils
添加到您的使用条款中。
答案 1 :(得分:10)
普通代码中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
答案 2 :(得分:2)
也许这有点太明显了,但是使用string
类型并不会传达有关变量的预期用法的任何信息。但是当你遇到一个声明为TFileName
的变量时,那里会传达更多细节。
同样的原则适用于其他基本类型,例如Integer
,Cardinal
,Double
等。相反,您可能需要考虑使用别名,例如TCustomerID
,{{ 1}},THashValue
等,因为它们更清楚地传达了这些变量的预期用途。
这提高了可读性,并且还允许在需要时更改基类型,而无需使用类型触摸任何代码...只需重新编译并且您已完成(但要小心使用二进制兼容性课程)。
答案 3 :(得分:1)
嗯,我强烈偏好const AFilename: String;
因为特别是对于大型项目,如果你需要从另一个编码器添加源代码,如果他们使用了很多自定义类型,如TCustomerID,THashValue,TInterestRate,而不是Integer,Cardinal,Double,那么你有很多上面提到的E2033来解决。
即使很多内置的delphi也不使用TFileName,如:
function MatchesMask(const Filename, Mask: string): Boolean;
此外,如果我有一个像AFileName: TFileName;
那样定义的变量,那么它显然是一个文件名&命名类型不会为我添加任何可读性,如果在某些情况下它会使代码的可读性降低,因为您必须单击以检查其派生的实际变量。