プロシージャ/関数にファイル名パラメータを渡すとき、TFilename
またはString
.
違いがある場合、それは何String
ですか?
例えば
procedure TForm1.OpenFile(const AFilename : String);
begin
//Open the file if it exists
...
end;
TFilename
IDE がプロパティ エディタを表示できるため、コンポーネントを開発するときに使用する必要があると思います(プロパティ インスペクタで省略記号をクリックすると、TOpenDialog が表示されます)。
これ以外は基本的にどちらを使っても違いはありません。使用する場合は、uses 句に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;
特に大規模なプロジェクトで、別のコーダーからソース コードを追加する必要がある場合、Integer、Cardinal、Double の代わりに TCustomerID、THashValue、TInterestRate などの多くのカスタム タイプを使用している場合です。の場合、上記の E2033 を解決する必要があります。
ソース コードに組み込まれている多くの Delphi でさえ、次のように TFileName を使用しません。
function MatchesMask(const Filename, Mask: string): Boolean;
さらに、そのようAFileName: TFileName;
に定義された変数がある場合、そのファイル名は明らかであり、名前付きの型は読みやすさを追加しません。場合によっては、クリックして実際の変数を確認する必要があるため、コードが読みにくくなりますに由来する。