2011-06-02 9 views
25

इस तरह कोड का एक टुकड़ा के साथ, संकलक c.MyProperty पर शिकायत:एक शून्य असाइनमेंट के साथ 'असाइन किए गए स्थानीय चर का उपयोग' को ठीक करना। क्यूं कर?

MyClass c; 

try { throw new Exception(); } 
catch (Exception) { } 

c.MyProperty = 2; // "Use of unassigned local variable 'c'". 

फिर भी अगर आप प्रारंभ में c करने के लिए एक null आवंटित यह शिकायत नहीं करता है:

MyClass c = null; 

try { throw new Exception(); } 
catch (Exception) { } 

c.MyProperty = 2; // no complains this time. 

तो, क्यों करता है इस काम? यदि c को null असाइन नहीं किया गया था और संकलक ने इसे hypothetically अनुमति दी है, तो c.MyProperty, पर एक ही अपवाद फेंक दिया जाएगा ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट के उदाहरण पर सेट नहीं है?

+0

हम्म, यह दिलचस्प है, मेरा अनुमान है कि हालांकि इस कोड (दूसरा संस्करण) अभी भी क्रम में एक अपवाद फेंक होगा .. यह संभावना सिर्फ एक दृश्य स्टूडियो मुद्दा है कि रिक्त काम उठा नहीं है - बस एक अनुमान ? –

+1

http://stackoverflow.com/questions/4770426/non-initialized-vs-null-values-of-reference-types – Haplo

+1

पर एक नज़र डालें, बहुत अच्छी तरह से और खूबसूरती से पूछे जाने वाले प्रश्न – user1451111

उत्तर

53

जब आप चर के लिए null असाइन करते हैं तो आप संकलक को वापस बंद कर रहे हैं क्योंकि आप उससे बेहतर जानते हैं, इसलिए उसे इसके बारे में शिकायत नहीं करनी चाहिए।

शायद यह इस तथ्य के कारण है कि null असाइन करने वाले को डेवलपर द्वारा स्पष्ट कार्रवाई माना जाता है।

+2

हालांकि मुझे हंसी मिली, मैं अभी भी एक जवाब के करीब नहीं है। –

+13

@ एंड्रियास: यह वास्तविक उत्तर है, यही कारण है कि इसकी अनुमति है। सी # आपको ** जानबूझकर ** पैर में अपने आप को गोली मार देगा। यह आपको इसे _unintentionally_ करने की अनुमति नहीं देगा। –

+0

हालांकि जिस तरह से मैंने उत्तर दिया था, मेरी राय में कुछ विनोद जोड़ने का मतलब था, मैं वास्तव में सोचता हूं कि यही कारण है कि संकलक शिकायत करना बंद कर देता है, इसलिए यह वैध जवाब है भले ही यह दिन के अंत में सही नहीं है। –

1

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

कल्पना अशक्त के अनुसार एसी # शाब्दिक है:

कार्य के मामले में के रूप में साथ ही

"नल-शाब्दिक परोक्ष एक संदर्भ प्रकार या नल प्रकार में बदला जा सकता":

(कल्पना से लिया गया)

बोली का प्रारंभ कल्पना से लिया निश्चित काम , संकलक का निर्धारण करने के लिए आदेश में निर्धारित करने के लिए कि प्रत्येक इस्तेमाल किया चर निश्चित रूप से असाइन किया गया है के लिए

5.3.3 सटीक नियम इस प्रक्रिया में वर्णित एक के बराबर एक प्रक्रिया का उपयोग करना चाहिए।

कंपाइलर प्रत्येक फ़ंक्शन सदस्य के शरीर को संसाधित करता है जिसमें एक या अधिक प्रारंभिक रूप से असाइन किए गए चर होते हैं। प्रत्येक शुरू में असाइन नहीं किए गए चर वी के लिए, संकलक समारोह सदस्य निम्न बिंदुओं में से प्रत्येक में वी के लिए एक निश्चित काम राज्य निर्धारित करता है:

· प्रत्येक कथन

· की शुरुआत अंत बिंदु पर (§8.1 पर) प्रत्येक कथन

· प्रत्येक चाप पर जो एक और बयान करने के लिए या एक बयान

· के अंत बात करने के लिए नियंत्रण हस्तांतरित कर देता है प्रत्येक अभिव्यक्ति

· की शुरुआत में कम से प्रत्येक अभिव्यक्ति

बोली

तो भी अशक्त हालांकि वास्तव में स्मृति में एक वस्तु की ओर संकेत नहीं है की समाप्ति के अंत में, यह निश्चित रूप से निर्धारित किये जाने की आवश्यकताओं को पूरा करता है और यही वजह है संकलक यह अनुमति देता है।

0

इसका कारण यह है सी # भाषा विनिर्देश वी 4.0 खंड 1.6.6.2 "विधि शरीर और स्थानीय चर" निम्नलिखित में कहा गया है:।

एक विधि शरीर चर कि विधि के आह्वान के लिए विशिष्ट हैं घोषणा कर सकते हैं । इस तरह के चर को स्थानीय चर कहा जाता है।

[छोड़ी]

सी # एक स्थानीय चर की आवश्यकता है निश्चित रूप से सौंपा अपने मूल्य प्राप्त किया जा सकता से पहले किया जाना है।

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

0

इस अपवाद के लिए कारण यह है कि आप चर जैसे

if (Request.Files != null && Request.Files.Count > 0) 
      { 
       Image = Request.Files.AllKeys[0]; 
      } 
var stream = new FileStream(Image,FileMode.Open); 

लिए एक डिफ़ॉल्ट मान नहीं सौंपा गया है अब छवि चर संकलक त्रुटि दे देंगे असाइन नहीं किए गए स्थानीय चर के

प्रयोग करें ' छवि '

यही वजह है कि स्थिति सच हो जाती है और नियंत्रण कभी नहीं पता होगा कि क्या छवि चर है। इसलिए या तो एक और ब्लॉक रखें या नीचे एक डिफ़ॉल्ट मान असाइन करें।

string Image = ""; 
if (Request.Files != null && Request.Files.Count > 0) 
      { 
       Image = Request.Files.AllKeys[0]; 
      } 
var stream = new FileStream(Image,FileMode.Open); 
संबंधित मुद्दे