मैं VB.NET के लिए Microsoft ट्यूटोरियल में उपयोग किए गए इन दो शब्दों को सुन रहा हूं। चरों के संदर्भ में उपयोग किए जाने पर इन दो शब्दों में क्या अंतर है?
मैं VB.NET के लिए Microsoft ट्यूटोरियल में उपयोग किए गए इन दो शब्दों को सुन रहा हूं। चरों के संदर्भ में उपयोग किए जाने पर इन दो शब्दों में क्या अंतर है?
जवाबों:
C # में चर 2 समूहों में से 1 में हैं। मान प्रकार या संदर्भ प्रकार। प्रकार की तरह है int
और DateTime
कर रहे हैं मूल्य प्रकार के। इसके विपरीत, आपके द्वारा बनाया गया कोई भी वर्ग एक संदर्भ प्रकार है। C # स्ट्रिंग्स भी एक संदर्भ प्रकार है। .NET फ्रेमवर्क में अधिकांश चीजें संदर्भ हैं प्रकार हैं।
चर नाम है और इसका मूल्य है । दो भाग ।
चर का नाम वही है जो आप इसे घोषित करते हैं। मूल्य क्या आप है आवंटित इसे करने के लिए।
सभी चर को हमेशा उस बिंदु पर प्रारंभिक मूल्य दिया जाता है जिस चर को घोषित किया जाता है । इस प्रकार सभी चरों को आरंभीकृत किया जाता है ।
के लिए मूल्य प्रकार, जैसे int
संकलक उन्हें कोई मान्य मान यदि आप ऐसा स्पष्ट रूप से ऐसा नहीं करते हैं दे देंगे। int
के प्रारंभ डिफ़ॉल्ट रूप से शून्य करने के लिए, DateTime
के प्रारंभ करने के लिए DateTime.MinValue
डिफ़ॉल्ट रूप से।
संदर्भ प्रकार चर आपके द्वारा दी जाने वाली वस्तु के लिए प्रारंभिक है। संकलक नहीं होंगे आवंटित एक वस्तु (यानी कोई मान्य मान) यदि आप ऐसा नहीं करते। इस मामले में मूल्य है null
- कुछ भी नहीं। इसलिए हम कहते हैं कि संदर्भ को शून्य करने के लिए आरम्भ किया गया है।
मनुष्य जन्म लेता है। वस्तुओं को त्वरित किया जाता है। एक बच्चा एक है उदाहरण के एक मानव, एक वस्तु एक है उदाहरण कुछ वर्ग की।
क्लास की एक आवृत्ति बनाने की क्रिया को तात्कालिकता कहा जाता है (टा-डा!)
MyClass myClassyReference = new MyClass();
इसके बाद के संस्करण में, यह कहना गलत है "... एक का उदाहरण बनाकर वस्तु ..."
संपादित करें - टिप्पणियों की चर्चा से प्रेरित
तीन अलग-अलग चीजें अलग-अलग शब्दावली का उपयोग कर (ऊपर) चल रही हैं और यह शब्दावली विनिमेय नहीं है:
MyClass myClassyReference
new MyClass()
=
।तथ्यों को बहाल करना:
एक संदर्भ-प्रकार के चर को केवल "एक संदर्भ" भी कहा जाता है। एक "मूल्य-प्रकार चर" एक संदर्भ नहीं है।
यह: "ऑब्जेक्ट एक वस्तु का एक उदाहरण है" गहराई से गलत है। यदि ऑब्जेक्ट "ऑब्जेक्ट का एक उदाहरण" था, तो यह होना चाहिए कि ऑब्जेक्ट ऑब्जेक्ट के प्रकार के साथ जीवन शुरू करता है - जो कुछ भी है - और वर्तमान स्थिति - जो कुछ भी है। ऑब्जेक्ट्स डी, ई, और एफ बनाने के बारे में क्या ऑब्जेक्ट बीबीबी बदलता है? नै, नै! यह वैचारिक और तकनीकी मामला है "ऑब्जेक्ट क्लास का एक उदाहरण है"। "तात्कालिकता" और "उदाहरण" का सटीक अर्थ है - एक वस्तु को एक वर्ग से इसका प्रकार, परिभाषा और मूल्य मिलता है।
MyClass myClassyReference = null
आम तौर पर हम यह नहीं कहते हैं कि "वेरिएबल को शून्य दिया गया है" और हम कभी भी यह नहीं कहते हैं कि "वेरिएबल अशक्त संदर्भित करता है", नहीं, इसके बजाय हम कहते हैं "वेरिएबल अशक्त है"; या "चर कुछ भी संदर्भित नहीं कर रहा है", या "संदर्भ शून्य है"
व्यावहारिक आवेदन:
मैंने आपके कोड पर अपनी उंगली डाली और कहा "इस उदाहरण के पास एक अमान्य संपत्ति है। शायद इसीलिए लूप विफल रहता है। आप तात्कालिकता के दौरान मापदंडों को मान्य करते हैं।" (अर्थात कंस्ट्रक्टर तर्क)।
मैं इसे आपके कोड में देखता हूं,
MyClass myClassyReference;
myClassyReference.DoSomething();
"आपने चर घोषित किया, लेकिन इसे कभी नहीं सौंपा। यह अशक्त है, इसलिए यह कुछ भी संदर्भित नहीं कर रहा है। इसीलिए विधि कॉल एक अपवाद फेंकता है।"
अंत संपादित करें
एक संदर्भ प्रकार चर का नाम और मूल्य स्वतंत्र रूप से मौजूद है। और मेरा मतलब स्वतंत्र है।
एक तात्कालिक वस्तु का कोई संदर्भ हो सकता है या नहीं।
एक तात्कालिक वस्तु के कई संदर्भ हो सकते हैं।
एक घोषित संदर्भ किसी वस्तु की ओर इशारा कर सकता है या नहीं भी हो सकता है ।
एक वैरिएबल को एक मूल्य के साथ आरंभीकृत किया जाता है। जब स्मृति को इसके लिए आवंटित किया जाता है और यह कंस्ट्रक्टर चलाया जाता है, तो एक वस्तु को तत्काल दिया जाता है।
उदाहरण के लिए यहाँ एक चर है:
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();
सेवा चीज़ शुरू करने के लिए उसे उसके शुरुआती मूल्य पर सेट करना है। किसी चीज को तुरंत करने के लिए उसका एक उदाहरण बनाना है।
अक्सर यह कमोबेश एक ही चीज होती है। यह:
SqlConnection conn = new SqlConnection();
तात्कालिक हैSqlConnection
ऑब्जेक्ट को , और चर को उस उदाहरण पर सेट करके आरंभ करता है conn
।
चूंकि किसी ऑब्जेक्ट का निर्माता ऑब्जेक्ट के गुणों को उनके डिफ़ॉल्ट मानों पर भी सेट करता है, इसलिए अक्सर यह कहना सही होता है कि किसी ऑब्जेक्ट को तत्काल शुरू करना उसे आरंभ करता है। (भ्रामक, यदि वस्तु एक ऐसी विधि को उजागर करती है, जिसे आपको तत्काल करने के बाद उसे प्रारंभ करने के लिए उसे कॉल करना होगा, जैसा कि कभी-कभी होता है।)
त्वरित का अर्थ है कि वस्तु का एक उदाहरण बनाया गया है। आरंभ का अर्थ है कि उसी वस्तु ने कुछ आरंभ किया है।
जब आप किसी क्लास या ऑब्जेक्ट को इंस्टेंट करते हैं, तो आप इसका एक नया उदाहरण बना रहे हैं, या मेमोरी को "होल्ड" करने के लिए आवंटित कर रहे हैं। उस वस्तु की शुरुआत करना तात्कालिकता के दौरान किए जाने वाले निर्देश होंगे।
जब आप किसी कक्षा का एक उदाहरण बनाते हैं तो इंस्टेंटिएशन होता है। यह उदाहरण तब एक वस्तु है, और आप इसके गुणों को सेट कर सकते हैं, या उस पर कॉल के तरीके (इसे करने के लिए कह सकते हैं)।
दीक्षा तब होती है जब आप किसी चीज़ के लिए शुरुआती परिस्थितियों का एक सेट तैयार करते हैं। यह एक वस्तु हो सकती है, जहाँ आप इसे स्वयं को आरंभ करने के लिए कहते हैं, या केवल एक चर जिसके लिए आप एक मूल्य प्रदान करते हैं।
एक वस्तु कुछ अन्य चीजों को इनिशियलाइज़ कर सकती है, या अन्य वस्तुओं को इसके दीक्षा के हिस्से के रूप में इंस्टेंट कर सकती है।
अंतर यह है कि तात्कालिकता एक ऐसी चीज का निर्माण है जो सामान कर सकती है; दीक्षा वह सामान है जो किया जाता है।
जावा डॉक्स देखें: 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."
हम इसे इस तरह देख सकते हैं। नीचे दिए गए कोड की एक पंक्ति के लिए:
var p = new Person();
उपरोक्त पंक्ति को दो तरीकों से पढ़ा जा सकता है:
संदर्भ या संदर्भ का विषय मायने रखता है। वेरिएबल के संदर्भ में बात करते समय , हम इनिशियलाइज़ शब्द का उपयोग करते हैं । वर्ग / प्रकार के संदर्भ में बात करते समय , हम तात्कालिकता शब्द का उपयोग करते हैं ।
तात्कालिकता स्मृति के आवंटन को संदर्भित करता है एक वर्ग का उदाहरण बनाने के लिए जबकि आरंभीकरण उस उदाहरण को चर नाम निर्दिष्ट करके उस उदाहरण का नामकरण करता है।
उदाहरण के लिए: SqlConnection conn = new SqlConnection();
यहां new
एक कीवर्ड है जो एक उदाहरण के लिए मेमोरी आवंटित करता है और conn
उस उदाहरण के लिए असाइन किया गया एक चर नाम है।
दूसरों ने अंतर को समझाया है, इसलिए मैं विस्तार से नहीं जाना चाहता। लेकिन ऐसे मामले हैं जहां तात्कालिकता किसी वस्तु को ठीक से प्रारंभ नहीं करती है। जब आप किसी वस्तु को त्वरित करते हैं तो आप इसे कुछ डेटा के साथ आरंभ भी करते हैं। वर्ग / प्रकार में प्रारंभिक तर्क होगा, जबकि तात्कालिकता तर्क आमतौर पर new
कीवर्ड (मूल रूप से मेमोरी आवंटन, संदर्भ प्रतिलिपि आदि) द्वारा किया जाता है । लेकिन तात्कालिकता के लिए आवश्यक नहीं है कि वस्तुओं के लिए एक वैध स्थिति में परिणाम हो जब हम कह सकते हैं कि वस्तु अनैतिक है । यहां एक व्यावहारिक उदाहरण है जहां किसी वस्तु को त्वरित किया जा सकता है लेकिन आरंभीकृत नहीं किया गया है (क्षमा करें उदा सी # में)।
class P { string name = "Ralf"; }
WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null
GetUninitializedObject
कंस्ट्रक्टर को वहां तुरंत वस्तु (लेकिन कुछ आंतरिक जादू) के लिए नहीं बुलाता है।
कोई यह भी तर्क दे सकता है कि मूल्य प्रकार त्वरित नहीं हैं, लेकिन केवल आरंभिक हैं क्योंकि इसे नए आवंटन की आवश्यकता नहीं होती है जब आप करते हैं new..
लेकिन यह तात्कालिकता की परिभाषा तक है।