आई/पी देख रहा था RegOpenKeyEx
की घोषणा आह्वान जब मैं पृष्ठ पर इस टिप्पणी पर ध्यान:अंतर
IntPtr
UIntPtr
को परिवर्तित: जब हैंडल के लिएIntPtr
साथ लागू, आप चलेंगे एक ओवरफ्लो मेंUIntPtr
सही विकल्प है यदि आप इसे 32 और 64 बिट प्लेटफ़ॉर्म पर सही तरीके से काम करना चाहते हैं।
यह मेरे लिए बहुत मतलब नहीं है: IntPtr
और UIntPtr
दोनों संकेत प्रतिनिधित्व करने के लिए तो उनके आकार ओएस की bitness से मेल खाना चाहिए अपेक्षा की जाती है - या तो 32 बिट या 64 बिट्स। चूंकि ये संख्याएं नहीं हैं लेकिन पॉइंटर्स हैं, उनके हस्ताक्षरित संख्यात्मक मूल्यों से कोई फर्क नहीं पड़ता, केवल उन बिट्स जो पते का प्रतिनिधित्व करते हैं। मैं किसी भी कारण से नहीं सोच सकता कि इन दोनों के बीच अंतर क्यों होगा लेकिन इस टिप्पणी ने मुझे अनिश्चित बना दिया।
IntPtr
के बजाय UIntPtr
का उपयोग करने का कोई विशिष्ट कारण है? documentation के अनुसार:
IntPtr
प्रकार, सीएलएस अनुरूप है, जबकिUIntPtr
प्रकार नहीं है। सामान्य भाषा रनटाइम में केवलIntPtr
प्रकार का उपयोग किया जाता है।UIntPtr
प्रकारIntPtr
प्रकार के साथ वास्तुकला समरूपता को बनाए रखने के लिए अधिकतर प्रदान किया जाता है।
यह, वास्तव में, इसका तात्पर्य है कि इसमें कोई अंतर नहीं है (जब तक कोई मान को पूर्णांक में परिवर्तित करने की कोशिश नहीं करता)। तो pinvoke.net से उपर्युक्त टिप्पणी गलत है?
संपादित:
MarkH's answer पढ़ने के बाद, मैं जाँच का एक सा था और पता चला कि NET अनुप्रयोगों बड़े पते के बारे में पता है जब 32-बिट में संकलित नहीं हैं और केवल एक 2GB वर्चुअल ऐड्रेस स्पेस संभाल कर सकते हैं मोड। (एक बड़े पते के बारे में पता झंडा चालू करने के लिए एक
hack उपयोग कर सकते हैं लेकिन Markh के जवाब से पता चलता है कि .नेट फ्रेमवर्क के अंदर चेकों बातें क्योंकि पता स्थान केवल 2GB, नहीं 3GB माना जाता है टूट जाएगा।)
इसका मतलब है कि एक पॉइंटर के पास सभी सही आभासी मेमोरी पते हो सकते हैं (जहां तक .NET Framework का संबंध है) 0x00000000 और 0x7FFFFFFF के बीच होगा। जब इस श्रेणी का अनुवाद
int
पर किया जाता है, तो कोई मान नकारात्मक नहीं होगा क्योंकि उच्चतम बिट सेट नहीं है। यह मेरी धारणा को मजबूत करता है कि IntPtr बनाम UIntPtr का उपयोग करने में कोई अंतर नहीं है। क्या मेरा तर्क सही है?
Fermat2357 ने बताया कि उपर्युक्त संपादन गलत है। के रूप में
private unsafe void* m_value;
आप कर रहे हैं सही दोनों बस केवल बिट्स है कि एक पते का प्रतिनिधित्व प्रबंध
यहां एक नज़र डालें। http://stackoverflow.com/questions/1320296/intptr-vs-uintptr –
@ Fermat2357 हां, यही वह प्रश्न था जिसने मुझे एक नया प्रश्न लिखने के लिए प्रेरित किया। – xxbbcc
मुझे लगता है कि आप सही हैं। बिल्कुल कोई फर्क नहीं पड़ता। एक 'हैंडल' संसाधन के लिए बस एक अद्वितीय संख्या है (निश्चित रूप से Win32 में इसे अक्सर स्मृति क्षेत्र में 32 बिट पॉइंटर के रूप में लागू किया जाता है)।हालांकि, 'IntPtr' किसी भी प्रकार की 32 बिट संख्या को एम्बेड करने में सक्षम है। UIntPtr में अंतर केवल इस संख्या की व्याख्या कुछ और नहीं है। समरूपता के लिए संकेत रैप करने के लिए एक नकली व्यर्थ प्रकार के होने - –