2009-02-18 14 views
23

वहाँ दो बयानों के बीच कोई अंतर है बुलाया समारोह के लिए। यदि मैं अपने आवेदन में IntPtr.Zero के साथ सभी नए IntPtr (0) को प्रतिस्थापित कर दूंगा, तो क्या इससे कोई नुकसान होगा?नई IntPtr (0) बनाम IntPtr.Zero

+0

'IntPtr.Zero' अधिक पठनीय है। मुझे लगता है कि इससे चिपकने वाला बेहतर होगा – user

उत्तर

24

IntPtr, एक मान प्रकार है वहाँ स्थिर संपत्ति IntPtr.Zero

होने में है, इसलिए String.Empty विपरीत जैसे ही आप पारित IntPtr.Zero कहीं भी आप एक प्रति मिल जाएगा तो चर initialisation के लिए यह कोई फर्क नहीं पड़ता अपेक्षाकृत कम लाभ:

IntPtr myPtr = new IntPtr(0); 
IntPtr myPtr2 = IntPtr.Zero; 

//using myPtr or myPtr2 makes no difference 
//you can pass myPtr2 by ref, it's now a copy 

एक अपवाद है, और है कि तुलना है:

if(myPtr != new IntPtr(0)) { 
    //new pointer initialised to check 
} 

if(myPtr != IntPtr.Zero) { 
    //no new pointer needed 
} 

कुछ पोस्टर पहले ही कह चुके हैं।

7

वे कार्यात्मक रूप से समकक्ष हैं, इसलिए इससे कोई समस्या नहीं होनी चाहिए।

IntPtr.Zero संरचना की डिफ़ॉल्ट स्थिति का प्रतिनिधित्व करता है (इसे घोषित किया गया है लेकिन कोई कन्स्ट्रक्टर उपयोग नहीं किया जाता है), इसलिए इंटिप्टर (शून्य *) का डिफ़ॉल्ट मान शून्य होगा। लेकिन, जैसा कि (शून्य *) बातिल और (शून्य *) 0, बराबर हैं IntPtr.Zero == नई IntPtr (0)

संपादित करें: जबकि वे बराबर हैं, मैं के बाद से तुलना के लिए IntPtr.Zero की सिफारिश करते हैं यह बस पढ़ने के लिए आसान है।

+0

यही मुझे लगता है ... :) तो वेब पर लगभग दस लाख नमूने क्यों हैं जो नए इंटिप्टर (0) का उपयोग करते हैं? स्थिर चर संस्करण का उपयोग करना बेहतर नहीं है? –

-2

यह ज्यादातर मामला encapsulation (और प्रदर्शन की, लेकिन बहुत कम सीमा तक) है। भविष्य में कुछ पल में माइक्रोसॉफ्ट तय कर सकता है (हालांकि यह बहुत ही असंभव है) कि एक प्रारंभिक सूचक मूल्य अब 0xDEADBEEF के बराबर होगा, इस प्रकार सभी new IntPtr(0) कोड अमान्य प्रस्तुत करेगा।

उदाहरण के लिए, मान चर, ip, IntPtr का एक उदाहरण है:

जहां तक ​​प्रदर्शन का सवाल है, MSDN इस कहते हैं। आप यह निर्धारित कर सकते हैं कि इसे किसी निर्माता द्वारा लौटाए गए मान से तुलना करके सेट किया गया है, उदाहरण के लिए: "यदि आईपी! = नया इंटिप्टर (0) ..."। हालांकि, एक अनियमित सूचक प्राप्त करने के लिए एक कन्स्ट्रक्टर का आह्वान करना अक्षम है। कोड या तो "if ip != IntPtr.Zero..." या "if !IntPtr.Zero.Equals(ip)..." कोड करना बेहतर है।

+0

-1: पहला पैराग्राफ सही नहीं है। नया IntPtr (0) एक प्रारंभिक IntPtr नहीं बनाता है; यह एक बनाता है जो स्पष्ट रूप से शून्य के लिए प्रारंभ किया गया है। IntPtr.Zero जैसा करता है। दोनों बिल्कुल अर्थात् समान हैं। –

+0

बिंदु यह है कि IntPtr.Zero संभावित रूप से किसी तीसरे पक्ष कोड को तोड़ने के बिना शून्य के अलावा किसी अन्य चीज़ के बराबर बदला जा सकता है। –

+0

नहीं, यह नहीं कर सकता। यह शून्य के मान के साथ एक IntPtr है, जैसा कि नाम इंगित करता है। एमएसडीएन से: "एक पठन-केवल फ़ील्ड जो एक सूचक या संभाल को दर्शाता है जिसे शून्य में प्रारंभ किया गया है।" (http://msdn.microsoft.com/en-us/library/system.intptr.zero.aspx) –

5

IntPtr.Zero के उपयोग आप IntPtr का एक नया उदाहरण से बचने के लिए अनुमति देगा।

msdn से

:

इस क्षेत्र का प्रयोग करें कुशलता से निर्धारित करने के लिए IntPtr का एक उदाहरण मान पर सेट किया गया है कि क्या अन्य शून्य से

+0

सच है, लेकिन इसमें ओपी का उल्लेख किसी भी मामले पर लागू नहीं होता है। –

1

क्या होता है अगर आप रेफरी द्वारा IntPtr.Zero पारित , और प्राप्तकर्ता संदर्भ को संशोधित करने का प्रयास करता है? उस क्षण से, IntPtr.Zero != new IntPtr(0) होगा, या परिवर्तन प्राप्त करने की कोशिश करने पर प्राप्तकर्ता को किसी प्रकार का अपवाद प्राप्त होगा?

मुझे इस बारे में निश्चित नहीं है, लेकिन यह उचित स्पष्टीकरण की तरह लगता है।

+0

आप रेफरी पैरामीटर को रेफ पैरामीटर के रूप में पास नहीं कर सकते हैं। –

+0

यही वह था जो मुझे डर था ... लेकिन मुझे लगता है कि ऐसा नहीं होता है। क्योंकि मैं वास्तव में इंफ्रेट.जेरो को रेफरी नहीं भेज रहा हूं। मैं शायद myPtr का मुक्केबाजी भेज रहा हूं। लेकिन मैं इसके बारे में वास्तव में निश्चित रूप से निश्चित नहीं हूं ... इसलिए मेरा प्रश्न ... :) –

+1

यदि आप अपनी अन्य विधि में इसे पास करने से पहले एक चर के लिए IntPtr.Zero असाइन करते हैं, तो आप IntPtr.Zero को पास नहीं कर रहे हैं लेकिन एक स्थानीय प्रति (यह एक संरचना है)। –

0

जेआईटीटर IntPtr.Zero को उसी तरह से रेखांकित कर सकता है जिस तरह से यह IntPtr.Size को रेखांकित करता है।

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