Должен ли я использовать String вместо TFilename?
При передаче параметров имени файла в процедуры/функции следует использовать TFilename
или String
.
Если есть разница, что это такое и какие потенциальные разветвления при использовании String
?
например.
procedure TForm1.OpenFile(const AFilename : String);
begin
//Open the file if it exists
...
end;
Ответы
Ответ 1
Я думаю, что TFilename
следует использовать при разработке компонентов, так как IDE может показать его редактор свойств (TOpenDialog будет отображаться при нажатии на эллипсис в инспекторе свойств).
Кроме этого, в принципе нет никакой разницы, какой из них использовать. Помните, что если вы используете TFilename
, вы должны добавить SysUtils
в предложение uses.
Ответ 2
Единственное практическое отличие типов 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
Ответ 3
Возможно, это слишком очевидно, но использование типа string
не сообщает ничего о предполагаемом использовании переменной. Но когда вы сталкиваетесь с переменной, объявленной как TFileName
, там там гораздо больше информации.
Тот же принцип применяется к другим базовым типам, таким как Integer
, Cardinal
, Double
и т.д. Вместо этого вы можете рассмотреть возможность использования псевдонимов для них, таких как TCustomerID
, THashValue
, TInterestRate
и т.д. поскольку они более четко информируют о предполагаемом использовании этих переменных.
Это улучшает удобочитаемость, а также позволяет изменять базовый тип, когда это необходимо, без необходимости касаться какого-либо кода с использованием типа... просто перекомпилируйте, и все готово (но будьте осторожны с двоичной совместимостью).
Ответ 4
Хмм, Мое сильное предпочтение для const AFilename: String;
По той причине, что особенно для крупных проектов, если вам когда-либо понадобится добавить исходный код из другого кодера, если они использовали множество пользовательских типов, таких как TCustomerID, THashValue, TInterestRate, вместо Integer, Cardinal, Double, тогда у вас есть много вышеупомянутый E2033 для решения.
Даже много встроенных в Delphi исходных кодов не использует TFileName, например:
function MatchesMask(const Filename, Mask: string): Boolean;
Кроме того, если у меня есть переменная, определенная как AFileName: TFileName;
, то ее очевидное ее имя файла и именованный тип не добавляют никакой удобочитаемости для меня, если что-то в некоторых случаях делает код менее читаемым, потому что вам нужно щелкнуть для проверки того, из какой фактической переменной она получена.