在传递文件名参数给过程/函数时,我应该使用 TFilename
还是 String
?
如果有区别,它是什么,使用 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
的变量时,就会传达更多详细信息。Integer
、Cardinal
、Double
等,您可能希望考虑使用别名,如 TCustomerID
、THashValue
、TInterestRate
等,因为它们更清晰地传达了这些变量的意图。嗯,我强烈倾向于使用const AFilename: String;
。原因是特别针对大型项目,如果您需要从其他编码人员添加源代码,如果他们使用了许多自定义类型,如TCustomerID、THashValue、TInterestRate,而不是Integer、Cardinal、Double等,则您需要解决很多上述E2033错误。
即使许多Delphi内置的源代码也没有使用TFileName,例如:
function MatchesMask(const Filename, Mask: string): Boolean;
AFileName: TFileName;
,那么很明显它是一个文件名,而命名的类型并没有为我增加任何可读性,有时甚至会使代码更难读,因为你必须点击以检查它是从哪个实际变量派生的。