2009-03-03 10 views
8

मैं संकेत को समझते हैं और उन्हें सी # कोड में उपयोग करने के लिए दुर्लभ जरूरत के लाभ उठाएं। मेरा सवाल है: कोड के ब्लॉक में स्पष्ट रूप से "असुरक्षित" होने के पीछे तर्क क्या है। इसके अतिरिक्त, "असुरक्षित" कोड को अनुमति देने के लिए एक कंपाइलर विकल्प क्यों बदला जाना चाहिए?सी #: स्पष्ट रूप से बताते हुए "असुरक्षित"/संकलक विकल्प

बॉटम लाइन: CLR (या भाषा चश्मा) में क्या यह इतना हम सिर्फ संकेत उपयोग नहीं कर सकते जब भी हम चाहते हैं (ज्यादा C और C++ की तरह) "असुरक्षित" टाइप करें और संकलक विकल्प बदलने के लिए बिना बनाता है ?

स्पष्टीकरण के लिए: मुझे पता है कि "असुरक्षित" और "सुरक्षित" कोड है। यह सिर्फ एक प्रश्न है कि हम इन सुविधाओं का उपयोग करने में सक्षम होने के लिए सभी अतिरिक्त काम क्यों करना चाहिए (ठीक है, इतना अधिक नहीं)।

उत्तर

9

है कि इस विषय here पर छू लेती है सी # निर्माता एंडर्स हेल्स्बर्ग के साथ एक साक्षात्कार नहीं है। असल में, बिल्कुल क्या @Marc Gravell ने कहा: पहले घोषणा, स्पष्ट घोषणा द्वारा असुरक्षित।

तो अपने सवाल का जवाब देने: CLR में कुछ भी नहीं रोकता है, यह एक भाषा मुहावरे है जो आपको प्रकार के साथ निपटने के दौरान सुरक्षा दस्ताने के साथ काम करने की अनुमति देने के लिए डिज़ाइन किया गया है। यदि आप दस्ताने बंद करना चाहते हैं, तो यह आपकी पसंद है, लेकिन आपको दस्ताने को बंद करने के लिए सक्रिय विकल्प बनाना है।

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

स्पष्टीकरण के लिए: मुझे पता है कि "असुरक्षित" और "सुरक्षित" कोड है। यह सिर्फ इन सुविधाओं का उपयोग करने में सक्षम होना कारण है कि हम सब अतिरिक्त काम (ठीक है, बहुत ज्यादा नहीं है कि अतिरिक्त) करना चाहिए की बस एक सवाल है।

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

तो "अतिरिक्त काम" आप क्या कर रहे हैं क्या इससे पहले कि आप यह कर के बारे में सोचना आप मजबूर करने के लिए जानबूझकर है। स्पष्ट किया जा रहा है, यह आप बलों कम से कम विचार करने के लिए: "मैं ऐसा क्यों कर रहा हूँ मैं वास्तव में एक सूचक की जरूरत जब एक संदर्भ प्रकार पर्याप्त होगा"

7

यह काफी हद तक के बारे में सत्यापन योग्य किया जा रहा है। unsafe बताकर, दस्ताने बंद हैं - सिस्टम अब गारंटी नहीं दे सकता कि आपका कोड अमोक नहीं चलाएगा। ज्यादातर मामलों में सुरक्षित क्षेत्र में रहने के लिए यह बहुत वांछनीय है।

यह आंशिक विश्वास (addins आदि) के साथ और अधिक ध्यान देने योग्य हो जाता है, लेकिन अभी भी नियमित रूप से कोड में मूल्यवान है।

+0

तो मूल रूप से, यह एमएस हमें उसी गलतियों को करने से रोकने की कोशिश कर रहा है जैसे सी ++ में बनाना बहुत आसान था? – Inisheer

+1

एमएस से: सी # कोड जो कम-स्तरीय एपीआई कॉल करता है, पॉइंटर अंकगणित का उपयोग करता है, या कुछ अन्य असुरक्षित ऑपरेशन करता है, को असुरक्षित कीवर्ड के साथ चिह्नित ब्लॉक के अंदर रखा जाना चाहिए। – VBNight

+0

# एमएस से: कुछ मामलों में, असुरक्षित कोड सरणी सीमाओं को हटाकर एप्लिकेशन के प्रदर्शन को बढ़ा सकता है। – VBNight

1

तो यह तुरंत स्पष्ट जो कोड वेब सेवाओं में ऊंचा अनुमतियाँ के बिना नहीं चलेगा आदि

1

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

2

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

2

देखने के विपरीत बिंदु से इसके बारे में सोचो: क्योंकि यह असुरक्षित चिह्नित नहीं कर रहा है, तो आप अनुमान लगा सकते हैं कि सबसे अधिक कोड "सुरक्षित" डिफ़ॉल्ट रूप से है। तो "सुरक्षित" होने का क्या अर्थ है? .NET कोड के लिए, इसमें शामिल है (लेकिन सीमित नहीं हो सकता है):

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

जब भी आप पॉइंटर्स का उपयोग करते हैं तो आपको इनमें से किसी भी गारंटी को तोड़ने का मौका मिलता है। इसलिए कोड को असुरक्षित के रूप में चिह्नित करना उन सुरक्षा को छोड़ देता है।

1

सुरक्षित और असुरक्षित कोड के बीच सबसे महत्वपूर्ण अंतर यह है कि असुरक्षित कोड .net का कचरा कलेक्टर द्वारा नहीं पहुंचा जा सकता है। स्वचालित जीसी .नेट के स्थानीय भाषा का एक बड़ा हिस्सा है और, जब आप इसकी सीमाओं से आगे जाते हैं, तो आप अपने कोड के बारे में बहुत कुछ समझ सकते हैं। विशेष रूप से

प्वाइंटर कोई जीसी संदर्भ के साथ ढेर पर वस्तुओं के निर्माण के लिए अनुमति देते हैं। इससे कोड को "असुरक्षित" के रूप में चिह्नित करने के लिए एक और उत्कृष्ट कारण होता है। जब आप महसूस करते हैं कि आपके पास एक स्मृति रिसाव आ रही है, तो यह संकुचित करना आसान बनाता है।

3

असल CLR बिल्कुल एक/असुरक्षित स्विच या कीवर्ड के बारे में कोई आवश्यकताओं बनाता है। वास्तव में, सी ++/सीएलआई (सी ++ भाषा जो सीएलआर के तहत चलती है) में ऐसा कोई असुरक्षित स्विच नहीं होता है, और पॉइंटर्स को सीएलआर पर स्वतंत्र रूप से उपयोग किया जा सकता है।

तो मैं आपके सवाल का अलग तरीके से व्यक्त के रूप में "क्यों सी # के उपयोग/असुरक्षित संकेत इस्तेमाल किया जा सकता से पहले की आवश्यकता है?" और उस प्रश्न का उत्तर यहां दिए गए अन्य उत्तरों में बताया गया है: उपयोगकर्ता को सीएलआर पर पूर्ण ट्रस्ट मोड से कम कुछ भी चलाने की क्षमता खोने का सचेत निर्णय लेने में मदद करने के लिए। सी ++ लगभग हमेशा CLR पर पूर्ण ट्रस्ट, और सी # कर सकते हैं जब भी आप कोड है कि पूर्ण ट्रस्ट की आवश्यकता है कहते हैं, या जब भी आप संकेत का उपयोग की आवश्यकता है।

+0

बिल्कुल। मैंने पहले "नीचे पंक्ति" भाग को दोहराया था। मैं अक्सर सी ++/सीएलआई का उपयोग करता हूं, और यह वास्तव में कारण है कि मैं इस प्रश्न को सी # के बारे में पूछता हूं। – Inisheer

2

संक्षेप में, नेट आप अपने इरादे राज्य के लिए चाहता है।

ज़रूर, संकलक "असुरक्षित" ध्वज के लिए की जरूरत का अनुमान लगा सकता है। लेकिन डिजाइनर चाहते हैं कि यह एक जानबूझकर निर्णय हो।

  • को तोड़ने के बिना कोई स्विच मामले
  • पहुँच नहीं स्तरीय "वर्गों" (जैसे कि "सार्वजनिक" के रूप में: सी में मार्कर ++

    मेरे लिए, यह सी # में वाक्यात्मक आवश्यकताओं की संख्या के लिए समान है)

  • कोई वर्ग "वर" का उपयोग क्षेत्रों

पैटर्न है कि आप आगे बढ़ना चाहिए या नहीं एक बात बदल सकते हैं और अनजाने में दूसरे को प्रभावित है। कारण के भीतर, वे आपको "पैर में खुद को शूटिंग" से रोकना चाहते हैं।

बहुत सारे महान, सूचनात्मक उत्तर यहां — शायद यह आपके प्रश्न के लिए अधिक हो जाता है।

संबंधित मुद्दे