2012-05-02 46 views
17

Khi chuyển các tham số tên tệp cho các thủ tục/chức năng, tôi có nên sử dụng TFilename hoặc String.Tôi có nên sử dụng String thay vì TFilename không?

Nếu có sự khác biệt, nó là gì và sau đó phân nhánh tiềm năng nào nếu sử dụng String?

ví dụ:

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

Trả lời

20

Tôi nghĩ TFilename nên được sử dụng khi phát triển các thành phần bởi vì đó là cách IDE có thể hiển thị nó là biên tập bất động sản (TOpenDialog sẽ được hiển thị khi nhấp vào lược trong thanh tra tài sản).

Khác với điều này về cơ bản không có sự khác biệt nào để sử dụng. Hãy nhớ rằng nếu bạn sử dụng TFilename, bạn phải thêm SysUtils vào mệnh đề sử dụng của mình.

10

Sự khác biệt thực tế duy nhất giữa các loại stringTFileName trong một mã đơn giản là chuyển đối số theo tham chiếu; đoạn mã sau

procedure GetFileName(var FileName: TFileName); 
begin 
    FileName:= 'abcd.abc'; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
var 
    S: string; 

begin 
    GetFileName(S); 
end; 

không biên dịch với lỗi

[DCC Error] E2033 Types of actual and formal var parameters must be identical 
2

Có lẽ đây là một chút quá rõ ràng, nhưng sử dụng các loại string không giao bất cứ điều gì về việc sử dụng dự định của một biến. Nhưng khi bạn gặp phải một biến được khai báo là TFileName, có nhiều chi tiết hơn được truyền đạt ngay tại đó.

Các nguyên tắc tương tự applys để loại cơ bản khác như Integer, Cardinal, Double, vv Thay vào đó bạn có thể muốn xem xét sử dụng bí danh cho các như TCustomerID, THashValue, TInterestRate, vv như những giao tiếp rõ ràng hơn nhiều những gì việc sử dụng dự định của những biến là.

Điều này cải thiện khả năng đọc và cũng cho phép thay đổi loại cơ sở khi cần, mà không cần phải chạm vào bất kỳ mã nào bằng cách sử dụng loại ... chỉ cần biên dịch lại và bạn đã hoàn thành (nhưng hãy cẩn thận với tính tương thích nhị phân) .

1

Hmm, sở thích mạnh mẽ của tôi là cho const AFilename: String; Cũng vì lý do đó đặc biệt là cho các dự án lớn hơn, nếu bạn đã bao giờ cần phải thêm mã nguồn từ coder khác, nếu họ đã sử dụng rất nhiều loại tùy chỉnh như TCustomerID, THashValue, TInterestRate, thay vì của Integer, Hồng y, Double, sau đó bạn có rất nhiều E2033 đã đề cập ở trên để giải quyết.

Thậm chí nhiều delphi xây dựng trong mã nguồn không sử dụng TFileName, như:

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

Hơn nữa, nếu tôi có một biến được định nghĩa như AFileName: TFileName; sau đó nó rõ ràng của nó một tên tập tin & loại được đặt tên không thêm bất kỳ khả năng đọc cho tôi, nếu bất cứ điều gì trong một số trường hợp nó làm cho mã ít đọc được, bởi vì bạn phải bấm qua để kiểm tra những gì biến thực tế của nó bắt nguồn từ.

Các vấn đề liên quan