Подтвердить что ты не робот

Должен ли я использовать String вместо TFilename?

При передаче параметров имени файла в процедуры/функции следует использовать TFilename или String.

Если есть разница, что это такое и какие потенциальные разветвления при использовании String?

например.

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

Ответ 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;, то ее очевидное ее имя файла и именованный тип не добавляют никакой удобочитаемости для меня, если что-то в некоторых случаях делает код менее читаемым, потому что вам нужно щелкнуть для проверки того, из какой фактической переменной она получена.