सी # में संकेत का कोई वास्तविक उपयोग? [बन्द है]


19

C # में कोडिंग करते समय क्या स्थिति है जहां पॉइंटर्स का उपयोग करना एक अच्छा या आवश्यक विकल्प है? मैं असुरक्षित पॉइंटर्स के बारे में बात कर रहा हूं ।


8
आह्ह यार, मैंने प्रश्न देखा और सब खुश हो गए क्योंकि मुझे यह समझाने की आवश्यकता होगी कि C # में आप हर समय पॉइंटर्स का उपयोग करते हैं, लेकिन आपको जाना था और स्पष्ट रूप से असुरक्षित कीवर्ड कहकर इसे बर्बाद करना था। धत तेरे की! :)
टोनी

जवाबों:


25

C # के डेवलपर से:

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

  • डिस्क पर मौजूदा संरचनाओं से निपटना
  • उन्नत COM या प्लेटफ़ॉर्म परिदृश्यों को आमंत्रित करता है, जिनमें पॉइंटर्स के साथ संरचनाएँ शामिल होती हैं
  • प्रदर्शन-महत्वपूर्ण कोड

अन्य स्थितियों में असुरक्षित संदर्भ का उपयोग हतोत्साहित किया जाता है।

विशेष रूप से, C # में C कोड लिखने का प्रयास करने के लिए एक असुरक्षित संदर्भ का उपयोग नहीं किया जाना चाहिए।

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

आप के माध्यम से जा सकते हैं इस संदर्भ के लिए


"असुरक्षित वातावरण में असुरक्षित कोड को अंजाम नहीं दिया जा सकता है।" क्या आपका मतलब "विश्वसनीय" था?
बजे डॉन लैरींक्स

18

हां, वास्तविक उपयोग हैं, जब प्रदर्शन महत्वपूर्ण है और संचालन निम्न स्तर के हैं

उदाहरण के लिए, मुझे केवल छवि तुलना के लिए C # में एक बार पॉइंटर्स का उपयोग करने की आवश्यकता है। 1024x1024x32 चित्रों की एक जोड़ी पर GetPixel का उपयोग करके तुलना (सटीक मिलान) करने में 2 मिनट का समय लगा। छवि मेमोरी को पिन करना और पॉइंटर्स का उपयोग करना 1 सेकंड (पाठ्यक्रम की एक ही मशीन पर) से कम समय लगा।


2
मैंने आपके लिए LockBits का उपयोग किया है ... ( msdn.microsoft.com/en-us/library/… )
विन्यासकर्ता

1
@configurator: यह था .net 2, LockBits मौजूद नहीं था
स्टीवन ए। लोव

2
यकीन है कि यह किया था, यह 1.0 के बाद से अस्तित्व में ...
विन्यासकर्ता

@configurator: मेरी त्रुटि, मैं MSDN दस्तावेज़ीकरण को नेविगेट करने में उलझन में पड़ गया (जब मैं बदल गया .net 2 ड्रापलिस्ट में यह पूरी तरह से अलग पृष्ठ पर गया था जिसमें लॉकबिट्स का उल्लेख नहीं किया गया था)। हां, यह है कि आप छवि मेमोरी को कैसे पिन करते हैं।
स्टीवन ए। लोव

6

आपको यह याद रखना होगा कि Microsoft के डिज़ाइनर स्मार्ट लोग हैं और C # में जो कुछ भी वे जोड़ते हैं, उसमें कम से कम 1 उपयोग का मामला है। FParsec परियोजना प्रदर्शन के हर पिछले ड्रॉप कि सी # करने में सक्षम है बाहर लाने के लिए असुरक्षित कोड का उपयोग करता है। के उपयोग पर ध्यान fixedऔर stackalloc

private char* ReadCharsFromStream(char* buffer, int maxCount, out string overhangChars) {
    Debug.Assert(maxCount >= 0);
    fixed (byte* byteBuffer = ByteBuffer) {
        overhangChars = null;
        try {
            while (maxCount >= MaxCharCountForOneByte) {// if maxCount < MaxCharCountForOneByte, Convert could throw
                int nBytesInByteBuffer = FillByteBuffer();
                bool flush = nBytesInByteBuffer == 0;
                int bytesUsed, charsUsed; bool completed = false;
                Decoder.Convert(byteBuffer + ByteBufferIndex, nBytesInByteBuffer,
                                buffer, maxCount, flush,
                                out bytesUsed, out charsUsed, out completed);
                ByteBufferIndex += bytesUsed; // GetChars consumed bytesUsed bytes from the byte buffer
                buffer += charsUsed;
                maxCount -= charsUsed;
                if (flush && completed) return buffer;
            }
            if (maxCount == 0) return buffer;

            char* cs = stackalloc char[MaxCharCountForOneByte];
            for (;;) {
                int nBytesInByteBuffer = FillByteBuffer();
                bool flush = nBytesInByteBuffer == 0;
                int bytesUsed, charsUsed; bool completed;
                Decoder.Convert(byteBuffer + ByteBufferIndex, nBytesInByteBuffer,
                                cs, MaxCharCountForOneByte, flush,
                                out bytesUsed, out charsUsed, out completed);
                ByteBufferIndex += bytesUsed;
                if (charsUsed > 0) {
                    int i = 0;
                    do {
                        *(buffer++) = cs[i++];
                        if (--maxCount == 0) {
                            if (i < charsUsed) overhangChars = new string(cs, i, charsUsed - i);
                            return buffer;
                        }
                    } while (i < charsUsed);
                }
                if (flush && completed) return buffer;
            }
        } catch (DecoderFallbackException e) {
            e.Data.Add("Stream.Position", ByteIndex + e.Index);
            throw;
        }
    }
}

1
मैं कहता हूँ कि डेवलपर्स (Microsoft या किसी अन्य कंपनियों में) एक बेवकूफ होंगे यदि उन्होंने कुछ सुविधा शामिल की क्योंकि इसमें 1 उपयोग का मामला है। एक सुविधा में केवल 1 उपयोग के मामलों की तुलना में बहुत अधिक होना चाहिए; अन्यथा यह एक ब्लोट है।
रेयान

4
रेमंड चेन ने अक्सर कहा है कि माइक्रोसॉफ्ट में सुविधाएँ -100 "अंक" पर शुरू होती हैं। एक सुविधा को लागू करने के लिए, इसे "इसे बनाने के लिए समग्र पैकेज पर एक महत्वपूर्ण शुद्ध सकारात्मक प्रभाव पड़ता है।" यहाँ ericgu की ब्लॉग पोस्ट इस c.2004 के बारे में है: blogs.msdn.com/b/ericgu/archive/2004/01/12/57985.aspx
Jesse Buchanan

मुझे पूरा यकीन है कि कुछ स्ट्रिंग ऑपरेशन आंतरिक रूप से असुरक्षित कोड का उपयोग करते हैं। तो, FParsec प्राथमिकता नहीं हो सकता है।
आर्टुरो टॉरेस सांचेज़

4

मुझे एक बार C # आधारित विंडोज़ एप्लिकेशन में पॉइंटर्स (असुरक्षित संदर्भ में) का उपयोग करना था जो कि एक हेडसेट के लिए एक इंटरफेस के रूप में कार्य करेगा। यह एप्लिकेशन एक उपयोगकर्ता इंटरफ़ेस है जो एजेंटों (एक कॉल सेंटर में) को अपने हेडफ़ोन सेटिंग्स को नियंत्रित करने की अनुमति देगा। यह एप्लिकेशन हेडसेट निर्माता द्वारा दिए गए नियंत्रण कक्ष के वैकल्पिक के रूप में कार्य करता है। इस प्रकार, उपलब्ध विकल्पों की तुलना में हेडसेट को नियंत्रित करने की उनकी क्षमता सीमित थी। मुझे पॉइंटर्स का उपयोग करना पड़ा क्योंकि मुझे पी / इनवॉक् स का उपयोग करके हेडसेट निर्माता द्वारा प्रदान की गई एपीआई (एक विजुअल C ++ dll) का उपयोग करना था।

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