"तात्कालिक" और "आरंभिक" के बीच अंतर क्या है?


105

मैं VB.NET के लिए Microsoft ट्यूटोरियल में उपयोग किए गए इन दो शब्दों को सुन रहा हूं। चरों के संदर्भ में उपयोग किए जाने पर इन दो शब्दों में क्या अंतर है?

जवाबों:


142

मान विज़-ए-विज़ संदर्भ प्रकार

C # में चर 2 समूहों में से 1 में हैं। मान प्रकार या संदर्भ प्रकार। प्रकार की तरह है intऔर DateTimeकर रहे हैं मूल्य प्रकार के। इसके विपरीत, आपके द्वारा बनाया गया कोई भी वर्ग एक संदर्भ प्रकार है। C # स्ट्रिंग्स भी एक संदर्भ प्रकार है। .NET फ्रेमवर्क में अधिकांश चीजें संदर्भ हैं प्रकार हैं।

चर का भाग

चर नाम है और इसका मूल्य हैदो भाग

चर का नाम वही है जो आप इसे घोषित करते हैं। मूल्य क्या आप है आवंटित इसे करने के लिए।

वेरिएबल्स को इनिशियलाइज़ किया जाता है

सभी चर को हमेशा उस बिंदु पर प्रारंभिक मूल्य दिया जाता है जिस चर को घोषित किया जाता है । इस प्रकार सभी चरों को आरंभीकृत किया जाता है

के लिए मूल्य प्रकार, जैसे intसंकलक उन्हें कोई मान्य मान यदि आप ऐसा स्पष्ट रूप से ऐसा नहीं करते हैं दे देंगे। intके प्रारंभ डिफ़ॉल्ट रूप से शून्य करने के लिए, DateTimeके प्रारंभ करने के लिए DateTime.MinValueडिफ़ॉल्ट रूप से।

संदर्भ प्रकार चर आपके द्वारा दी जाने वाली वस्तु के लिए प्रारंभिक है। संकलक नहीं होंगे आवंटित एक वस्तु (यानी कोई मान्य मान) यदि आप ऐसा नहीं करते। इस मामले में मूल्य है null- कुछ भी नहीं। इसलिए हम कहते हैं कि संदर्भ को शून्य करने के लिए आरम्भ किया गया है।

वस्तुओं को त्वरित किया जाता है

मनुष्य जन्म लेता है। वस्तुओं को त्वरित किया जाता है। एक बच्चा एक है उदाहरण के एक मानव, एक वस्तु एक है उदाहरण कुछ वर्ग की।

क्लास की एक आवृत्ति बनाने की क्रिया को तात्कालिकता कहा जाता है (टा-डा!)

इसलिए घोषित करें , आरंभ करें , और तुरंत इस तरह से एक साथ आएं

MyClass myClassyReference = new MyClass();

इसके बाद के संस्करण में, यह कहना गलत है "... एक का उदाहरण बनाकर वस्तु ..."


संपादित करें - टिप्पणियों की चर्चा से प्रेरित

तीन अलग-अलग चीजें अलग-अलग शब्दावली का उपयोग कर (ऊपर) चल रही हैं और यह शब्दावली विनिमेय नहीं है:

  1. एक संदर्भ चर घोषित किया जाता है - MyClass myClassyReference
  2. एक वस्तु को तत्काल दिया जाता है (... दिए गए वर्ग के / से , निहित) -new MyClass()
  3. ऑब्जेक्ट को चर को सौंपा गया है। =

तथ्यों को बहाल करना:

  1. एक संदर्भ-प्रकार के चर को केवल "एक संदर्भ" भी कहा जाता है। एक "मूल्य-प्रकार चर" एक संदर्भ नहीं है।

  2. यह: "ऑब्जेक्ट एक वस्तु का एक उदाहरण है" गहराई से गलत है। यदि ऑब्जेक्ट "ऑब्जेक्ट का एक उदाहरण" था, तो यह होना चाहिए कि ऑब्जेक्ट ऑब्जेक्ट के प्रकार के साथ जीवन शुरू करता है - जो कुछ भी है - और वर्तमान स्थिति - जो कुछ भी है। ऑब्जेक्ट्स डी, ई, और एफ बनाने के बारे में क्या ऑब्जेक्ट बीबीबी बदलता है? नै, नै! यह वैचारिक और तकनीकी मामला है "ऑब्जेक्ट क्लास का एक उदाहरण है"। "तात्कालिकता" और "उदाहरण" का सटीक अर्थ है - एक वस्तु को एक वर्ग से इसका प्रकार, परिभाषा और मूल्य मिलता है।

  3. MyClass myClassyReference = null आम तौर पर हम यह नहीं कहते हैं कि "वेरिएबल को शून्य दिया गया है" और हम कभी भी यह नहीं कहते हैं कि "वेरिएबल अशक्त संदर्भित करता है", नहीं, इसके बजाय हम कहते हैं "वेरिएबल अशक्त है"; या "चर कुछ भी संदर्भित नहीं कर रहा है", या "संदर्भ शून्य है"

व्यावहारिक आवेदन:

  • मैंने आपके कोड पर अपनी उंगली डाली और कहा "इस उदाहरण के पास एक अमान्य संपत्ति है। शायद इसीलिए लूप विफल रहता है। आप तात्कालिकता के दौरान मापदंडों को मान्य करते हैं।" (अर्थात कंस्ट्रक्टर तर्क)।

  • मैं इसे आपके कोड में देखता हूं,

    MyClass myClassyReference;
    myClassyReference.DoSomething();

    "आपने चर घोषित किया, लेकिन इसे कभी नहीं सौंपा। यह अशक्त है, इसलिए यह कुछ भी संदर्भित नहीं कर रहा है। इसीलिए विधि कॉल एक अपवाद फेंकता है।"

अंत संपादित करें


होने का असहनीय हल्कापन

एक संदर्भ प्रकार चर का नाम और मूल्य स्वतंत्र रूप से मौजूद है। और मेरा मतलब स्वतंत्र है।

एक तात्कालिक वस्तु का कोई संदर्भ हो सकता है या नहीं।

एक तात्कालिक वस्तु के कई संदर्भ हो सकते हैं।

एक घोषित संदर्भ किसी वस्तु की ओर इशारा कर सकता है या नहीं भी हो सकता है ।


सही व्याख्या!
एम। फवाद सूरश

यदि यह कहना गलत है: "... किसी वस्तु का उदाहरण बनाना ...", तो आपको क्या कहना चाहिए? "... किसी ऑब्जेक्ट को तत्काल करना, और इसके लिए एक संदर्भ निर्दिष्ट करना ..."?
आरोन डेके

या इसके बारे में क्या: "... किसी वस्तु को तात्कालिक बनाना, और एक चर को इसके संदर्भ में प्रारंभ करना"? जिसमें दोनों शब्द शामिल हैं और यह सभी को अलग-थलग करने के लिए लगता है - हालांकि, लंबे समय तक। तुम क्या सोचते हो?
आरोन डेके

... आपको क्या कहना चाहिए? कहो: "एक वर्ग का एक उदाहरण बनाना", न कि '... किसी वस्तु का'। और "इसके एक संदर्भ के लिए एक चर को तात्कालिक करना" दोहरी बात है और 2 तरीकों से गलत है: (1) केवल ऑब्जेक्ट्स को त्वरित किया जाता है। (2) एक चर 'एक वस्तु की ओर इशारा' एक संदर्भ चर है, या संक्षेप में, चर संदर्भ है। मैं इसे अलग तरीके से कहूंगा: एक "संदर्भ प्रकार" चर एक संदर्भ है। यह एक वस्तु को - या इंगित करता है।
रडारब्ज

40

एक वैरिएबल को एक मूल्य के साथ आरंभीकृत किया जाता है। जब स्मृति को इसके लिए आवंटित किया जाता है और यह कंस्ट्रक्टर चलाया जाता है, तो एक वस्तु को तत्काल दिया जाता है।

उदाहरण के लिए यहाँ एक चर है:

Dim obj as Object

इस चर को प्रारंभ नहीं किया गया है । एक बार जब मैं objवैरिएबल को मान प्रदान करता हूं , तो वैरिएबल को इनिशियलाइज़ किया जाएगा। यहाँ आरंभीकरण के उदाहरण हैं:

obj = 1
obj = "foo"

तात्कालिकता एक बहुत अलग चीज है लेकिन संबंधित है क्योंकि आमतौर पर प्रारंभ के बाद तात्कालिकता होती है:

Dim obj As New Object()

कोड की पूर्ववर्ती पंक्ति में, objचर को नए के संदर्भ में आरंभीकृत किया जाता है जो Objectकि त्वरित था । हम कहते हैं कि नया Objectत्वरित था क्योंकि हमने इसका एक नया उदाहरण बनाया है।

अब मेरा मानना ​​है कि VB.NET इसे C # की तुलना में बहुत अधिक भ्रमित करता है क्योंकि यह स्पष्ट नहीं है कि ऊपर दिए गए कोड में एक असाइनमेंट हो रहा है। C # में यह बहुत स्पष्ट है कि किसी इंस्टेंस का एक इंस्ट्रक्शन और एक वेरिएबल का इनिशियलाइज़ेशन दोनों है:

Object obj = new Object();

@ और वस्तु obj = 1; आरंभीकरण और वस्तु है obj = नई वस्तु () / तात्कालिकता और आरंभीकरण है यह आपने उल्लेख किया है। अब मैं आपसे दो बातें पूछना चाहता हूं। 1. यह क्या है? वस्तु obj; ? 2. स्मृति आवंटित की गई है जब मैं ऑब्जेक्ट obj का उपयोग करता हूं ?? या जब यह इस कोड ऑब्जेक्ट obj = 1 द्वारा इसे इनिशियलाइज़ करता है, तब इसे अलोकेट किया जाता है; ?
काशिफ

मैं कहूंगा कि "ऑब्जेक्ट ऑब्ज" घोषणा है, और नहीं, स्मृति अभी तक आवंटित नहीं की गई है। या कम से कम केवल पर्याप्त स्मृति "शून्य" का मान रखने के लिए। वैरिएबल के लिए वास्तविक मेमोरी को एक बार आरम्भ करने के बाद मूल्य के आधार पर आवंटित किया जाएगा।
एरोन डेके

14

सेवा चीज़ शुरू करने के लिए उसे उसके शुरुआती मूल्य पर सेट करना है। किसी चीज को तुरंत करने के लिए उसका एक उदाहरण बनाना है।

अक्सर यह कमोबेश एक ही चीज होती है। यह:

SqlConnection conn = new SqlConnection();

तात्कालिक हैSqlConnectionऑब्जेक्ट को , और चर को उस उदाहरण पर सेट करके आरंभ करता है conn

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


4

* तात्कालिकता का अर्थ किसी वर्ग या वस्तु के लिए एक उदाहरण बनाना है। औपनिवेशीकरण का अर्थ है * किसी भी उद्देश्य के लिए एक ही वस्तु या वर्ग का आरंभ करना। **


3

त्वरित का अर्थ है कि वस्तु का एक उदाहरण बनाया गया है। आरंभ का अर्थ है कि उसी वस्तु ने कुछ आरंभ किया है।


2

जब आप किसी क्लास या ऑब्जेक्ट को इंस्टेंट करते हैं, तो आप इसका एक नया उदाहरण बना रहे हैं, या मेमोरी को "होल्ड" करने के लिए आवंटित कर रहे हैं। उस वस्तु की शुरुआत करना तात्कालिकता के दौरान किए जाने वाले निर्देश होंगे।


2

जब आप किसी कक्षा का एक उदाहरण बनाते हैं तो इंस्टेंटिएशन होता है। यह उदाहरण तब एक वस्तु है, और आप इसके गुणों को सेट कर सकते हैं, या उस पर कॉल के तरीके (इसे करने के लिए कह सकते हैं)।

दीक्षा तब होती है जब आप किसी चीज़ के लिए शुरुआती परिस्थितियों का एक सेट तैयार करते हैं। यह एक वस्तु हो सकती है, जहाँ आप इसे स्वयं को आरंभ करने के लिए कहते हैं, या केवल एक चर जिसके लिए आप एक मूल्य प्रदान करते हैं।

एक वस्तु कुछ अन्य चीजों को इनिशियलाइज़ कर सकती है, या अन्य वस्तुओं को इसके दीक्षा के हिस्से के रूप में इंस्टेंट कर सकती है।

अंतर यह है कि तात्कालिकता एक ऐसी चीज का निर्माण है जो सामान कर सकती है; दीक्षा वह सामान है जो किया जाता है।


1

जावा डॉक्स देखें: https://docs.oracle.com/javase/tutorial/java/javaOO/objectingreat.html

" प्वाइंट ओरिजन = नया प्वाइंट (23, 94);

Declaration: The code set in bold are all variable declarations that associate a variable name with an object type.
Instantiation: The new keyword is a Java operator that creates the object.
Initialization: The new operator is followed by a call to a constructor, which initializes the new object."

1

हम इसे इस तरह देख सकते हैं। नीचे दिए गए कोड की एक पंक्ति के लिए:

var p = new Person();

उपरोक्त पंक्ति को दो तरीकों से पढ़ा जा सकता है:

  1. चर p को एक व्यक्ति वर्ग के रूप में आरंभीकृत किया गया है
  2. व्यक्ति वर्ग को चर p में त्वरित किया गया है

संदर्भ या संदर्भ का विषय मायने रखता है। वेरिएबल के संदर्भ में बात करते समय , हम इनिशियलाइज़ शब्द का उपयोग करते हैं । वर्ग / प्रकार के संदर्भ में बात करते समय , हम तात्कालिकता शब्द का उपयोग करते हैं ।


0

तात्कालिकता स्मृति के आवंटन को संदर्भित करता है एक वर्ग का उदाहरण बनाने के लिए जबकि आरंभीकरण उस उदाहरण को चर नाम निर्दिष्ट करके उस उदाहरण का नामकरण करता है।

उदाहरण के लिए: SqlConnection conn = new SqlConnection();

यहां newएक कीवर्ड है जो एक उदाहरण के लिए मेमोरी आवंटित करता है और connउस उदाहरण के लिए असाइन किया गया एक चर नाम है।


0

दूसरों ने अंतर को समझाया है, इसलिए मैं विस्तार से नहीं जाना चाहता। लेकिन ऐसे मामले हैं जहां तात्कालिकता किसी वस्तु को ठीक से प्रारंभ नहीं करती है। जब आप किसी वस्तु को त्वरित करते हैं तो आप इसे कुछ डेटा के साथ आरंभ भी करते हैं। वर्ग / प्रकार में प्रारंभिक तर्क होगा, जबकि तात्कालिकता तर्क आमतौर पर newकीवर्ड (मूल रूप से मेमोरी आवंटन, संदर्भ प्रतिलिपि आदि) द्वारा किया जाता है । लेकिन तात्कालिकता के लिए आवश्यक नहीं है कि वस्तुओं के लिए एक वैध स्थिति में परिणाम हो जब हम कह सकते हैं कि वस्तु अनैतिक है । यहां एक व्यावहारिक उदाहरण है जहां किसी वस्तु को त्वरित किया जा सकता है लेकिन आरंभीकृत नहीं किया गया है (क्षमा करें उदा सी # में)।

class P { string name = "Ralf"; }

WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null

GetUninitializedObject कंस्ट्रक्टर को वहां तुरंत वस्तु (लेकिन कुछ आंतरिक जादू) के लिए नहीं बुलाता है।

कोई यह भी तर्क दे सकता है कि मूल्य प्रकार त्वरित नहीं हैं, लेकिन केवल आरंभिक हैं क्योंकि इसे नए आवंटन की आवश्यकता नहीं होती है जब आप करते हैं new..लेकिन यह तात्कालिकता की परिभाषा तक है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.