我该使用String还是TFilename?

17

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

如果有区别,它是什么,使用 String 可能会带来什么潜在的影响?

例如:

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

20

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

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


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
也许这个显而易见,但是使用 string 类型并没有传达变量的意图。但是当你遇到一个声明为 TFileName 的变量时,就会传达更多详细信息。
类似地,对于其他基本类型,如 IntegerCardinalDouble 等,您可能希望考虑使用别名,如 TCustomerIDTHashValueTInterestRate 等,因为它们更清晰地传达了这些变量的意图。
这提高了可读性,并且在需要时允许更改基础类型,而无需触及使用该类型的任何代码... 只需重新编译即可完成(但当然要小心二进制兼容性)。

1

嗯,我强烈倾向于使用const AFilename: String;。原因是特别针对大型项目,如果您需要从其他编码人员添加源代码,如果他们使用了许多自定义类型,如TCustomerID、THashValue、TInterestRate,而不是Integer、Cardinal、Double等,则您需要解决很多上述E2033错误。

即使许多Delphi内置的源代码也没有使用TFileName,例如:

  function MatchesMask(const Filename, Mask: string): Boolean;  

此外,如果我定义了一个变量,如AFileName: TFileName;,那么很明显它是一个文件名,而命名的类型并没有为我增加任何可读性,有时甚至会使代码更难读,因为你必须点击以检查它是从哪个实际变量派生的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接