Tôi hơi muộn cho bữa tiệc, nhưng tôi vẫn muốn thêm một số thông tin về các hằng số có thể ghi.
Trước hết, như Johan và David tuyên bố các hằng số toàn cầu và cục bộ không khác nhau về bộ nhớ.
Đối với những người quan tâm đến việc sử dụng các hằng số có thể ghi: Tôi thấy hữu ích khi mô phỏng chức năng "Hứa hẹn" để làm cho chức năng "Lười biếng". Ofcourse delphi không hỗ trợ Promises, vì vậy đây chỉ là một phần hiệu quả.
Xem xét một hàm để đếm số lượng từ trong một chuỗi:
function CountWords(Input: String):Integer;
var
Worker: TStringList;
begin
Worker := TStringList.Create;
Worker.DelimitedText := Input;
Result := Worker.Count;
Worker.Free;
end;
Bây giờ tưởng tượng nó beeing gọi nhiều lần trong chương trình của chúng tôi. Đối tượng TStringList sẽ được tạo ra và giải phóng mỗi khi chúng ta thực hiện nó, do đó làm thêm công việc. Bạn ofcourse thể giải quyết điều này bằng cách tạo ra một Worker_CountWords biến toàn cầu, khởi tạo nó trên đầu chương trình và sử dụng nó trong chức năng của bạn, nhưng hãy xem này:
function CountWords(Input: String):Integer;
{$J+} //Enable writable constants
const
Worker: TStringList = nil;
{$J-} //Disable writable constants
begin
if Worker = nil then
begin
Worker := TStringList.Create;
//Other Initialization code here
end;
Worker.DelimitedText := Input;
Result := Worker.Count;
end;
Chức năng này sẽ chỉ tạo TStringList lần và sử dụng nó sau này , nhưng sẽ không bao giờ giải phóng nó (một nhược điểm ở đây). Nhưng đối với một chức năng có thể được gọi bất kỳ lúc nào trong khi ứng dụng đang chạy thì đây là loại phù hợp. Điều này có thể làm cho mã của bạn trông sạch hơn một chút nếu bạn sẽ ... Bây giờ, hãy chú ý - đây không thực sự là lời hứa, nhưng nó đạt được kết quả tương tự. Bạn có thể làm điều này với các cuộc gọi hàm (tôi đã thử thay thế hàm thực sự trong bộ nhớ và ý tưởng khá xấu, nhưng bạn có thể tạo một const để giữ con trỏ hoạt động, lúc bắt đầu giữ con trỏ đến hàm khởi tạo và sau đó thay thế cho chức năng công nhân thực tế và chức năng cha mẹ sẽ chỉ có một cuộc gọi đến một chức năng được tổ chức trong một hằng số). Tôi không thể nghĩ ra một ví dụ tốt ngay bây giờ, vì vậy tôi sẽ cho bạn thấy rằng một trong những ngày của riêng bạn.
Ngoài ra nó không phải là cần thiết để có {$ WRITABLECONST ON} để thay đổi giá trị không đổi, bạn cũng có thể làm một cái gì đó như thế này:
procedure DoSomeWork;
const
FirstCall : TDateTime = 0;
begin
if FirstCall = 0 then
PDateTime(@FirstCall)^ := Now;
Writeln(TimeToStr(FirstCall));
//some actual work here
end;
Cùng một điều áp dụng cho const
tham số trong chức năng, bởi vì họ là chính xác giống như tham số var
(thông qua tham chiếu để tránh dành thời gian tạo biến riêng biệt), khác biệt duy nhất là trình biên dịch không cho phép bạn thay đổi các giá trị này bình thường.
P.S. Hãy cẩn thận với các thông số chức năng const, vì bạn có thể vượt qua các hằng số thực tế như foo(12)
và cố gắng sửa đổi điều đó có thể gây rối ...
@ user539484 - ngừng giảm giá ẩn danh; Tôi gần như chắc chắn đó là bạn! Tôi đang xem diễn viên bỏ phiếu của bạn. – TLama