我应该使用String而不是TFilename吗?

时间:2012-05-02 14:51:30

标签: string delphi delphi-7 filenames

将文件名参数传递给过程/函数时,我应该使用TFilename还是String

如果存在差异,它是什么,以及如果使用String会产生什么后果呢?

e.g。

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

4 个答案:

答案 0 :(得分:20)

我认为在开发组件时应该使用TFilename,因为这样IDE可以显示它的属性编辑器(在属性检查器中单击省略号时将显示TOpenDialog)。

除此之外,使用哪个基本没有区别。请记住,如果您使用TFilename,则必须将SysUtils添加到您的使用条款中。

答案 1 :(得分: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 :(得分:2)

也许这有点太明显了,但是使用string类型并不会传达有关变量的预期用法的任何信息。但是当你遇到一个声明为TFileName的变量时,那里会传达更多细节。

同样的原则适用于其他基本类型,例如IntegerCardinalDouble等。相反,您可能需要考虑使用别名,例如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;那样定义的变量,那么它显然是一个文件名&命名类型不会为我添加任何可读性,如果在某些情况下它会使代码的可读性降低,因为您必须单击以检查其派生的实际变量。