मैं पार्टी के लिए थोड़ा देर हो चुकी हूं, लेकिन मैं अभी भी लिखने योग्य स्थिरताओं पर कुछ जानकारी जोड़ना चाहता हूं।
सबसे पहले, जैसा कि जोहान और डेविड ने कहा कि वैश्विक और स्थानीय स्थिरांक स्मृति में भिन्न नहीं हैं।
लिखने योग्य स्थिरांक के उपयोग में रुचि रखने वालों के लिए: मुझे यह कार्य "आलसी" बनाने के लिए "वादा" कार्यक्षमता अनुकरण करने के लिए उपयोगी पाया गया। संभोग डेल्फी वादे का समर्थन नहीं करता है, इसलिए यह केवल आंशिक रूप से कुशल है।
एक समारोह एक स्ट्रिंग में शब्दों की राशि की गणना करने के विचार करें:
function CountWords(Input: String):Integer;
var
Worker: TStringList;
begin
Worker := TStringList.Create;
Worker.DelimitedText := Input;
Result := Worker.Count;
Worker.Free;
end;
अब कल्पना यह हमारे कार्यक्रम में कई बार कहा जाता है beeing। TStringList ऑब्जेक्ट बनाया जाएगा और प्रत्येक बार जब हम ऐसा करते हैं तो अतिरिक्त नौकरी कर रहे हैं। आप बेशक, एक वैश्विक चर Worker_CountWords बनाने के द्वारा इस का समाधान कर सकता कार्यक्रम प्रारंभ होने पर यह प्रारंभ करें और अपने समारोह में इसका इस्तेमाल करते हैं, लेकिन इस पर एक नज़र डालें:
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;
यह फ़ंक्शन केवल TStringList एक बार पैदा करेगा और बाद में उसका उपयोग , लेकिन इसे कभी मुक्त नहीं करेगा (यहां एक नकारात्मक पक्ष)। लेकिन एक फ़ंक्शन के लिए जिसे ऐप के दौरान किसी भी समय बुलाया जा सकता है, यह चल रहा है। यह आपके कोड को थोड़ा क्लीनर बना सकता है यदि आप ... अब ध्यान दें - यह वास्तव में एक वादा नहीं है, लेकिन यह समान परिणाम प्राप्त करता है। आप इसे फ़ंक्शन कॉल के साथ भी कर सकते हैं (मैंने पहले से ही वास्तविक फ़ंक्शन को स्मृति में बदलने की कोशिश की है और यह बहुत बुरा विचार है, लेकिन आप एक कॉन्स्टेंट बना सकते हैं जो पॉइंटर को फ़ंक्शन करने के लिए रखेगा, जो प्रारंभ में प्रारंभिक फ़ंक्शन के लिए पॉइंटर रखता है और उसके बाद वास्तविक कार्यकर्ता फ़ंक्शन में बदल दिया गया है और पैरेंट फ़ंक्शन केवल एक फ़ंक्शन पर कॉल करेगा जो स्थिर में आयोजित होता है)। मैं अभी एक अच्छा उदाहरण नहीं सोच सकता, इसलिए मैं आपको इसे स्वयं को समझने दूँगा।
procedure DoSomeWork;
const
FirstCall : TDateTime = 0;
begin
if FirstCall = 0 then
PDateTime(@FirstCall)^ := Now;
Writeln(TimeToStr(FirstCall));
//some actual work here
end;
यही बात कार्यों में const
मापदंडों पर लागू होता है, क्योंकि वे कर रहे हैं,:
इसके अलावा यह आप भी कुछ इस तरह कर सकता है क्रम निरंतर मूल्यों को संशोधित करने में {$ WRITABLECONST पर} के लिए आवश्यक नहीं है, var
पैरामीटर के समान बिल्कुल (भिन्न चर बनाने पर समय बिताने से बचने के संदर्भ में पारित), केवल अंतर यह है कि कंपाइलर आपको इन मानों को सामान्य रूप से बदलने की अनुमति नहीं देता है।
पीएस स्थिरांक समारोह मानकों के साथ सावधान रहो, जब से तुम foo(12)
की तरह वास्तविक स्थिरांक गुजरती हैं और है कि कर सकता है शायद गंदगी कुछ को संशोधित करने की कोशिश कर सकते हैं ...
@ user539484 - गुमनाम रूप से नीचे हटना बंद करें; मुझे यकीन है कि यह तुम हो! मैं आपका वोट कास्ट देख रहा हूं। – TLama