C # में कोडिंग करते समय क्या स्थिति है जहां पॉइंटर्स का उपयोग करना एक अच्छा या आवश्यक विकल्प है? मैं असुरक्षित पॉइंटर्स के बारे में बात कर रहा हूं ।
C # में कोडिंग करते समय क्या स्थिति है जहां पॉइंटर्स का उपयोग करना एक अच्छा या आवश्यक विकल्प है? मैं असुरक्षित पॉइंटर्स के बारे में बात कर रहा हूं ।
जवाबों:
C # के डेवलपर से:
सी # में पॉइंटर्स के उपयोग की शायद ही कभी आवश्यकता होती है, लेकिन कुछ स्थितियां ऐसी होती हैं जिनकी उन्हें आवश्यकता होती है। उदाहरण के लिए, संकेत देने के लिए असुरक्षित संदर्भ का उपयोग करते हुए निम्नलिखित मामलों द्वारा वारंट किया जाता है:
- डिस्क पर मौजूदा संरचनाओं से निपटना
- उन्नत COM या प्लेटफ़ॉर्म परिदृश्यों को आमंत्रित करता है, जिनमें पॉइंटर्स के साथ संरचनाएँ शामिल होती हैं
- प्रदर्शन-महत्वपूर्ण कोड
अन्य स्थितियों में असुरक्षित संदर्भ का उपयोग हतोत्साहित किया जाता है।
विशेष रूप से, C # में C कोड लिखने का प्रयास करने के लिए एक असुरक्षित संदर्भ का उपयोग नहीं किया जाना चाहिए।
सावधानी: "असुरक्षित संदर्भ का उपयोग करते हुए लिखे गए कोड को सुरक्षित होने के लिए सत्यापित नहीं किया जा सकता है, इसलिए इसे तभी निष्पादित किया जाएगा जब कोड पूरी तरह से विश्वसनीय हो। दूसरे शब्दों में, असुरक्षित वातावरण में असुरक्षित कोड को निष्पादित नहीं किया जा सकता है। उदाहरण के लिए, आप कैफे नहीं चला सकते। इंटरनेट से सीधे कोड। "
आप के माध्यम से जा सकते हैं इस संदर्भ के लिए
हां, वास्तविक उपयोग हैं, जब प्रदर्शन महत्वपूर्ण है और संचालन निम्न स्तर के हैं
उदाहरण के लिए, मुझे केवल छवि तुलना के लिए C # में एक बार पॉइंटर्स का उपयोग करने की आवश्यकता है। 1024x1024x32 चित्रों की एक जोड़ी पर GetPixel का उपयोग करके तुलना (सटीक मिलान) करने में 2 मिनट का समय लगा। छवि मेमोरी को पिन करना और पॉइंटर्स का उपयोग करना 1 सेकंड (पाठ्यक्रम की एक ही मशीन पर) से कम समय लगा।
आपको यह याद रखना होगा कि 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;
}
}
}
मुझे एक बार C # आधारित विंडोज़ एप्लिकेशन में पॉइंटर्स (असुरक्षित संदर्भ में) का उपयोग करना था जो कि एक हेडसेट के लिए एक इंटरफेस के रूप में कार्य करेगा। यह एप्लिकेशन एक उपयोगकर्ता इंटरफ़ेस है जो एजेंटों (एक कॉल सेंटर में) को अपने हेडफ़ोन सेटिंग्स को नियंत्रित करने की अनुमति देगा। यह एप्लिकेशन हेडसेट निर्माता द्वारा दिए गए नियंत्रण कक्ष के वैकल्पिक के रूप में कार्य करता है। इस प्रकार, उपलब्ध विकल्पों की तुलना में हेडसेट को नियंत्रित करने की उनकी क्षमता सीमित थी। मुझे पॉइंटर्स का उपयोग करना पड़ा क्योंकि मुझे पी / इनवॉक् स का उपयोग करके हेडसेट निर्माता द्वारा प्रदान की गई एपीआई (एक विजुअल C ++ dll) का उपयोग करना था।