क्या डिफ़ॉल्ट रूप से डेल्फी चर को एक मूल्य के साथ आरंभ किया जाता है?


103

मैं डेल्फी के लिए नया हूं, और मैं कुछ परीक्षण चला रहा हूं यह देखने के लिए कि ऑब्जेक्ट चर और स्टैक चर को डिफ़ॉल्ट रूप से आरंभ किया गया है:

TInstanceVariables = class
  fBoolean: boolean; // always starts off as false
  fInteger: integer; // always starts off as zero
  fObject: TObject; // always starts off as nil
end;

यह वह व्यवहार है जिसका उपयोग मैं अन्य भाषाओं से कर रहा हूं, लेकिन मैं सोच रहा हूं कि क्या डेल्फी में इस पर भरोसा करना सुरक्षित है? उदाहरण के लिए, मैं सोच रहा हूं कि क्या यह संकलक सेटिंग पर निर्भर हो सकता है, या शायद अलग-अलग मशीनों पर अलग-अलग काम करता है। क्या वस्तुओं के लिए डिफ़ॉल्ट प्रारंभिक मानों पर भरोसा करना सामान्य है, या क्या आप स्पष्ट रूप से कंस्ट्रक्टर में सभी उदाहरण चर सेट करते हैं?

जैसा कि स्टैक (प्रक्रिया-स्तर) चर के लिए, मेरे परीक्षण दिखा रहे हैं कि यूनिटाइज्ड बूलियन्स सच हैं, यूनिटाइज्ड पूर्णांक 2129993264 हैं, और असिंचित वस्तुएं केवल अमान्य पॉइंटर्स हैं (अर्थात शून्य नहीं)। मैं अनुमान लगा रहा हूं कि उन्हें एक्सेस करने से पहले हमेशा प्रक्रिया-स्तरीय चर निर्धारित करना है?


3
दो नोट: 1. रिकॉर्ड प्रारंभिक नहीं हैं। 2. रेफरेंस काउंटेड वेरिएबल्स को हमेशा इनिशियलाइज़ किया जाता है। !परंतु! एक फ़ंक्शन में जो एक स्ट्रिंग लौटाता है, 'परिणाम' खाली स्ट्रिंग के लिए आरंभिक नहीं है जैसा कि आप उम्मीद कर सकते हैं। ऐसा इसलिए है क्योंकि 'परिणाम' स्थानीय संस्करण नहीं है। तो, हमेशा करते हैं: परिणाम: = '';
InNameOfScience


जवाबों:


105

हाँ, यह प्रलेखित व्यवहार है:

  • ऑब्जेक्ट फ़ील्ड को हमेशा 0, 0.0, '', गलत, शून्य या जो कुछ भी लागू होता है, के लिए आरंभिक किया जाता है।

  • वैश्विक चर हमेशा 0 आदि के लिए भी आरंभीकृत होते हैं;

  • स्थानीय संदर्भ-गणना * चर हमेशा शून्य या '' के लिए आरंभिक होते हैं;

  • स्थानीय गैर-संदर्भ-गणना * चर असमान हैं, इसलिए आपको उनका उपयोग करने से पहले एक मूल्य निर्दिष्ट करना होगा।

मुझे याद है कि बैरी केली ने कहीं "रेफरेंस-काउंटेड" के लिए एक परिभाषा लिखी थी, लेकिन इसे कोई और नहीं पा सकता है, इसलिए इस बीच करना चाहिए:

संदर्भ-गिना == जो संदर्भ-स्वयं को गिना जाता है, या प्रत्यक्ष या अप्रत्यक्ष रूप से ऐसे फ़ील्ड होते हैं (रिकॉर्ड के लिए) या तत्व (सरणियों के लिए) जो संदर्भ-गिने जाते हैं: जैसे string, variant, interface या गतिशील सरणी या स्थिर सरणी जिसमें इस प्रकार होते हैं।

टिप्पणियाँ:

  • record स्वयं संदर्भ-गणना बनने के लिए पर्याप्त नहीं है
  • मैंने अभी तक जेनेरिक के साथ यह कोशिश नहीं की है

2
जैसा कि जियाकोमो ने नीचे दी गई टिप्पणियों में बताया है, यह सब डेल्फी की मदद से फाइलों को एमएस-हेल्प: //borland.bds4/bds4ref/html/Variables.htm में बताया गया है। डेल्फी 2009 में मुझे "वैरिएबल" के लिए सहायता खोजकर एक ही जानकारी मिली (मजेदार रूप से पर्याप्त मैंने बहुत सारी खोज की कोशिश की, लेकिन मैंने उस एक को आज़माने के लिए नहीं सोचा था)।
एमबी।

8
स्थानीय चर आरंभिक ($ 0) हैं यदि वे एक प्रबंधित प्रकार के होते हैं जैसे तार, इंटरफ़ेस, डायनेमिक सरणियाँ या वैरिएंट
फ्रांसिस्का

5
वहाँ एक अपवाद है, हालांकि! जब आप कंस्ट्रक्टर को ओवरराइड करते हैं, और इनहेरिट किए गए कंस्ट्रक्टर को कॉल नहीं करते हैं, तो एक मौका होता है कि कुछ फ़ील्ड अनइंस्टॉल किए जाते हैं! (विशेष रूप से पुराने डेल्फी संस्करणों के साथ।) चूंकि टोबेक्ट.क्रिएट सभी डेटा को शून्य करने के लिए जिम्मेदार है, न कि उस कॉल में जो संभव है अज्ञात डेटा।
दस ब्रिंक

18
@ImtenBrink मुझे लगता है कि आप गलत हैं। प्रारंभ में नहीं किया गया है TObject.Create, जो एक शून्य विधि है, लेकिन class function TObject.InitInstance(Instance: Pointer): TObject;जिसमें पुराने किसी भी डेल्फी संस्करण के लिए भी किसी भी निर्माता को कॉल करने से पहले हमेशा बुलाया जाता है। आपकी टिप्पणी IMHO गलत और भ्रमित करने वाली है।
अरनौद बूचेज़

7
यह मत भूलो कि एक फ़ंक्शन में जो एक स्ट्रिंग लौटाता है, 'परिणाम' को खाली स्ट्रिंग के लिए आरंभीकृत नहीं किया जाता है जैसा कि आप उम्मीद कर सकते हैं। ऐसा इसलिए है क्योंकि 'परिणाम' स्थानीय संस्करण नहीं है।
InNNOOScience 21

27

वैश्विक चर जिनके पास एक स्पष्ट इनिशियलाइज़र नहीं है, उन्हें निष्पादन में बीएसएस अनुभाग में आवंटित किया जाता है। वे वास्तव में EXE में कोई स्थान नहीं लेते हैं; बीएसएस अनुभाग एक विशेष खंड है जिसे ओएस आवंटित करता है और शून्य को साफ करता है। अन्य ऑपरेटिंग सिस्टम पर, समान तंत्र हैं।

आप वैश्विक वैरिएबल पर निर्भर हो सकते हैं, जो शून्य-आरंभिक है।


21

कक्षा फ़ील्ड डिफ़ॉल्ट शून्य हैं। यह प्रलेखित है इसलिए आप इस पर भरोसा कर सकते हैं। स्थानीय स्टैक वेरिएबल्स अपरिभाषित होते हैं जब तक कि स्ट्रिंग या इंटरफ़ेस, ये शून्य पर सेट नहीं होते हैं।


धन्यवाद। "शून्य" मुझे थोड़ा भ्रमित कर रहा है - क्या इसका मतलब है कि तार '' हैं, और इंटरफेस शून्य हैं?
एमबी।

4
हाँ, बिलकुल। नील = 0 (असेंबलर स्तर पर) और '' = नील (डेल्फी सम्मेलन)।
गाबर

1
"जब तक स्ट्रिंग या इंटरफ़ेस" वास्तविकता का पूर्ण विवरण नहीं है। उदाहरण के लिए, डायनेमिक एरेज़ को भी इनिशियलाइज़ किया जाता है। अधिक आम तौर पर, नियम यह है कि प्रबंधित (संदर्भ-गणना) प्रकारों के चर आरंभिक हैं, भले ही स्थानीय हों।
एंड्रियास रिजेब्रांड

16

साइड नोट के रूप में (जैसा कि आप डेल्फी में नए हैं): ग्लोबल वैरिएबल्स को घोषित करते समय सीधे शुरू किया जा सकता है:

var myGlobal:integer=99;

2
चूँकि 10.3 स्थानीय वैरिएबल्स पर लागू होता है
एडिज कोलेसनिकोव्स

1
और यदि स्पष्ट रूप से नहीं किया जाता है, तो उन्हें 0, 0.0, असत्य, शून्य, [], आदि से
आरंभ किया जाता है

7

यहाँ एक संक्षेप अध्याय 2 में रे लिस्चनर्स डेल्फी का एक उद्धरण है

"जब डेल्फी पहली बार एक ऑब्जेक्ट बनाता है, तो सभी फ़ील्ड खाली होने लगते हैं, अर्थात, पॉइंटर्स को शून्य से आरंभ किया जाता है, तार और डायनेमिक सरणियाँ खाली होती हैं, संख्याओं का मान शून्य होता है, बूलियन फ़ील्ड गलत होते हैं, और वेरिएंट को अनसाइनड किया जाता है। (विवरण के लिए अध्याय 5 में NewInstance और InitInstance देखें।)

यह सही है कि स्थानीय-इन-स्कोप वैरिएबल्स को इनिशियलाइज़ करने की आवश्यकता है ... मैं ऊपर दिए गए कॉमेंट को मानता हूँ कि "ग्लोबल वैरिएबल्स इनिशियलाइज़्ड हैं" जब तक कि एक संदर्भ के साथ प्रदान नहीं किया जाता - मुझे विश्वास नहीं होता।

संपादित करें ... बैरी केली का कहना है कि आप उन पर शून्य-आरंभीकृत होने पर निर्भर कर सकते हैं, और जब से वह डेल्फी संकलक टीम पर है मेरा मानना ​​है कि खड़ा है :) धन्यवाद बैरी।


1
2006 में डेल्फी की मदद से आप इसे यहाँ पा सकते हैं: ms-help: //borland.bds4/bds4ref/html/Variables.htm "यदि आप स्पष्ट रूप से एक वैश्विक चर को इनिशियलाइज़ नहीं करते हैं, तो कंपाइलर इसे 0. ऑब्जेक्ट उदाहरण डेटा से आरंभ करता है ( फ़ील्ड्स भी 0. के लिए इनिशियलाइज़ की जाती हैं।
जियाको डिग्ली एस्पोस्टी सेप

"मुझे विश्वास नहीं होता" के कारण नीच। यह प्रोग्रामिंग है, धर्म नहीं। और जियाकोमो ने सिर्फ सच्चाई का प्रदर्शन किया।
InNameOfScience

6

वैश्विक चर और वस्तु उदाहरण डेटा (फ़ील्ड) को हमेशा शून्य से आरंभ किया जाता है। प्रक्रियाओं और विधियों में स्थानीय चर को Win32 डेल्फी में आरंभ नहीं किया जाता है; जब तक आप उन्हें कोड में मान नहीं देते तब तक उनकी सामग्री अपरिभाषित होती है।


5

यहां तक ​​कि अगर कोई भाषा डिफ़ॉल्ट आरंभीकरण प्रदान करती है, तो मुझे विश्वास नहीं है कि आपको उन पर भरोसा करना चाहिए। किसी मान को प्रारंभ करना अन्य डेवलपर्स के लिए बहुत अधिक स्पष्ट है, जो भाषा में डिफ़ॉल्ट आरंभीकरण के बारे में नहीं जानते हैं और संकलक में समस्याओं को रोकते हैं।


4
निःसंदेह तुमसे हो सकता है। और आपको चाहिए। हर कंस्ट्रक्टर में 0 / '' / गलत / शून्य सब कुछ शुरू करना सिर्फ अनावश्यक है। दूसरी ओर, वैश्विक चर की शुरुआत करना इतना बेवकूफी भरा नहीं है - मैं एक बार के लिए कभी भी याद नहीं रख सकता कि वे आरंभीकृत हैं या नहीं (जैसा कि मैं उनका उपयोग नहीं कर रहा हूं)।
गबर

2
यदि डेल्फी आपको एक वैरिएबल को एक ही बिंदु पर आरंभीकृत करने देता है जैसा कि आप इसे घोषित करते हैं (जैसे var fObject: TObject = nil) तो मैं इस बात से सहमत होना चाहूंगा कि किसी मूल्य के लिए इनिशियलाइज़ करना शायद एक अच्छा विचार है। लेकिन मेरे लिए यह हर वस्तु क्षेत्र के लिए कंस्ट्रक्टर में करना थोड़ा अधिक लगता है।
एमबी।

4

डेल्फी 2007 मदद फ़ाइल से:

एमएस-सहायता: //borland.bds5/devcommon/variables_xml.html

"यदि आप स्पष्ट रूप से एक वैश्विक चर को इनिशियलाइज़ नहीं करते हैं, तो कंपाइलर इसे 0. पर इनिशियलाइज़ करता है।"


3

मेरे पास दिए गए उत्तरों के साथ एक छोटी सी पकड़ है। डेल्फी ने ग्लोबल्स और नव-निर्मित वस्तुओं की मेमोरी स्पेस को शून्य कर दिया। हालांकि इस NORMALLY का अर्थ है कि वे आरंभीकृत हैं, एक मामला है जहां वे नहीं हैं: विशिष्ट मानों के साथ प्रगणित प्रकार। क्या होगा अगर शून्य एक कानूनी मूल्य नहीं है ??


1
शून्य हमेशा एक कानूनी मूल्य है, यह एनम का 1 मान है। आप इसे आर्ड (MyFirstEnumValue) के साथ देख सकते हैं।
फ्रांसेस्का

यह प्रगणित प्रकार में पहला मान लौटाएगा।
स्कैम्राद्ट

6
यदि आप स्पष्ट रूप से एनम को मान देते हैं तो शून्य हमेशा एक कानूनी मूल्य नहीं है। उस स्थिति में, यह अभी भी 0 से आरंभिक है, और आपके पास एक अवैध मूल्य है। लेकिन एनम सिर्फ सामान्य शक्कर प्रकारों पर चित्रित किया गया चीनी है, इसलिए यह वास्तव में कुछ भी नहीं तोड़ता है। सुनिश्चित करें कि आपका कोड इससे निपट सकता है।
मेसन व्हीलर

2
@ फ्रांस्वा: यदि आप अपनी TOneTwoThree = (One=1, Two=2, Three=3);
दुश्मनी को

0

नई शुरुआत (डेल्फी 10.3 के बाद से) इनलाइन वैरिएबल शुरुआती मूल्यों के नियंत्रण को आसान बना रहे हैं।

procedure TestInlineVariable;
begin
  var index: Integer := 345;
  ShowMessage(index.ToString);
end;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.