17

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

如果有区别,那是什么,如果使用 a ,那么潜在的后果是String什么?

例如

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

4 回答 4

20

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

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

于 2012-05-02T14:57:58.880 回答
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
于 2012-05-02T15:22:35.233 回答
2

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

相同的原则适用于其他基本类型,如Integer,等。相反CardinalDouble您可能需要考虑为这些类型使用别名,如TCustomerID, THashValue,TInterestRate等,因为它们更清楚地传达了这些变量的预期用途。

这提高了可读性,并且还允许在需要时更改基本类型,而无需使用该类型触及任何代码......只需重新编译即可完成(但请注意二进制兼容性)。

于 2012-05-07T09:41:48.457 回答
1

嗯,我的强烈偏好是因为const AFilename: String; 特别是对于大型项目,如果您需要从其他编码器添加源代码,如果他们使用了许多自定义类型,如 TCustomerID、THashValue、TInterestRate,而不是 Integer、Cardinal、Double , 那么你有很多上面提到的 E2033 需要解决。

甚至很多源代码中内置的 delphi 也不使用 TFileName,例如:

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

此外,如果我定义了一个变量,AFileName: TFileName;那么它显然是一个文件名和命名类型不会为我增加任何可读性,如果在某些情况下它会降低代码的可读性,因为你必须点击查看它的实际变量源自。

于 2014-07-13T16:15:13.967 回答