将文件名参数传递给过程/函数时,我应该使用TFilename
or 吗String
?
如果有区别,那是什么,如果使用 a ,那么潜在的后果是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
类型并不能传达任何关于变量预期用途的信息。但是当你遇到一个声明为 a 的变量时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;
那么它显然是一个文件名和命名类型不会为我增加任何可读性,如果在某些情况下它会降低代码的可读性,因为你必须点击查看它的实际变量源自。