वहाँ दो बयानों के बीच कोई अंतर है बुलाया समारोह के लिए। यदि मैं अपने आवेदन में IntPtr.Zero के साथ सभी नए IntPtr (0) को प्रतिस्थापित कर दूंगा, तो क्या इससे कोई नुकसान होगा?नई IntPtr (0) बनाम IntPtr.Zero
उत्तर
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
}
कुछ पोस्टर पहले ही कह चुके हैं।
वे कार्यात्मक रूप से समकक्ष हैं, इसलिए इससे कोई समस्या नहीं होनी चाहिए।
IntPtr.Zero संरचना की डिफ़ॉल्ट स्थिति का प्रतिनिधित्व करता है (इसे घोषित किया गया है लेकिन कोई कन्स्ट्रक्टर उपयोग नहीं किया जाता है), इसलिए इंटिप्टर (शून्य *) का डिफ़ॉल्ट मान शून्य होगा। लेकिन, जैसा कि (शून्य *) बातिल और (शून्य *) 0, बराबर हैं IntPtr.Zero == नई IntPtr (0)
संपादित करें: जबकि वे बराबर हैं, मैं के बाद से तुलना के लिए IntPtr.Zero की सिफारिश करते हैं यह बस पढ़ने के लिए आसान है।
यही मुझे लगता है ... :) तो वेब पर लगभग दस लाख नमूने क्यों हैं जो नए इंटिप्टर (0) का उपयोग करते हैं? स्थिर चर संस्करण का उपयोग करना बेहतर नहीं है? –
यह ज्यादातर मामला encapsulation (और प्रदर्शन की, लेकिन बहुत कम सीमा तक) है। भविष्य में कुछ पल में माइक्रोसॉफ्ट तय कर सकता है (हालांकि यह बहुत ही असंभव है) कि एक प्रारंभिक सूचक मूल्य अब 0xDEADBEEF
के बराबर होगा, इस प्रकार सभी new IntPtr(0)
कोड अमान्य प्रस्तुत करेगा।
उदाहरण के लिए, मान चर,
ip
,IntPtr
का एक उदाहरण है:जहां तक प्रदर्शन का सवाल है, MSDN इस कहते हैं। आप यह निर्धारित कर सकते हैं कि इसे किसी निर्माता द्वारा लौटाए गए मान से तुलना करके सेट किया गया है, उदाहरण के लिए: "यदि आईपी! = नया इंटिप्टर (0) ..."। हालांकि, एक अनियमित सूचक प्राप्त करने के लिए एक कन्स्ट्रक्टर का आह्वान करना अक्षम है। कोड या तो "
if ip != IntPtr.Zero...
" या "if !IntPtr.Zero.Equals(ip)...
" कोड करना बेहतर है।
-1: पहला पैराग्राफ सही नहीं है। नया IntPtr (0) एक प्रारंभिक IntPtr नहीं बनाता है; यह एक बनाता है जो स्पष्ट रूप से शून्य के लिए प्रारंभ किया गया है। IntPtr.Zero जैसा करता है। दोनों बिल्कुल अर्थात् समान हैं। –
बिंदु यह है कि IntPtr.Zero संभावित रूप से किसी तीसरे पक्ष कोड को तोड़ने के बिना शून्य के अलावा किसी अन्य चीज़ के बराबर बदला जा सकता है। –
नहीं, यह नहीं कर सकता। यह शून्य के मान के साथ एक IntPtr है, जैसा कि नाम इंगित करता है। एमएसडीएन से: "एक पठन-केवल फ़ील्ड जो एक सूचक या संभाल को दर्शाता है जिसे शून्य में प्रारंभ किया गया है।" (http://msdn.microsoft.com/en-us/library/system.intptr.zero.aspx) –
IntPtr.Zero
के उपयोग आप IntPtr
का एक नया उदाहरण से बचने के लिए अनुमति देगा।
:
इस क्षेत्र का प्रयोग करें कुशलता से निर्धारित करने के लिए IntPtr का एक उदाहरण मान पर सेट किया गया है कि क्या अन्य शून्य से
सच है, लेकिन इसमें ओपी का उल्लेख किसी भी मामले पर लागू नहीं होता है। –
क्या होता है अगर आप रेफरी द्वारा IntPtr.Zero
पारित , और प्राप्तकर्ता संदर्भ को संशोधित करने का प्रयास करता है? उस क्षण से, IntPtr.Zero != new IntPtr(0)
होगा, या परिवर्तन प्राप्त करने की कोशिश करने पर प्राप्तकर्ता को किसी प्रकार का अपवाद प्राप्त होगा?
मुझे इस बारे में निश्चित नहीं है, लेकिन यह उचित स्पष्टीकरण की तरह लगता है।
आप रेफरी पैरामीटर को रेफ पैरामीटर के रूप में पास नहीं कर सकते हैं। –
यही वह था जो मुझे डर था ... लेकिन मुझे लगता है कि ऐसा नहीं होता है। क्योंकि मैं वास्तव में इंफ्रेट.जेरो को रेफरी नहीं भेज रहा हूं। मैं शायद myPtr का मुक्केबाजी भेज रहा हूं। लेकिन मैं इसके बारे में वास्तव में निश्चित रूप से निश्चित नहीं हूं ... इसलिए मेरा प्रश्न ... :) –
यदि आप अपनी अन्य विधि में इसे पास करने से पहले एक चर के लिए IntPtr.Zero असाइन करते हैं, तो आप IntPtr.Zero को पास नहीं कर रहे हैं लेकिन एक स्थानीय प्रति (यह एक संरचना है)। –
जेआईटीटर IntPtr.Zero को उसी तरह से रेखांकित कर सकता है जिस तरह से यह IntPtr.Size को रेखांकित करता है।
- 1. C# संकेत बनाम IntPtr
- 2. IntPtr बनाम UIntPtr
- 3. IntPtr.Zero शून्य के बराबर है?
- 4. .NET इंटरऑप IntPtr बनाम रेफ
- 5. IntPtr.Zero और डिफ़ॉल्ट (IntPtr) की तुलना करना क्यों संभव नहीं है?
- 6. मार्शल.PtrToStringUni() बनाम नई स्ट्रिंग()?
- 7. सी # IntPtr int
- 8. list.item (0) सूची बनाम [0]
- 9. सी # में IntPtr कैसे मुक्त करें?
- 10. कॉन्स बनाम नई कॉन्स
- 11. int बनाम IntPtr जब आपके पास हैंडल है?
- 12. स्वरूपप्रोवाइडर बनाम विस्तार विधि बनाम नई कक्षा
- 13. structs को intPtr
- 14. PHP $ स्ट्रिंग {0} बनाम $ स्ट्रिंग [0];
- 15. (स्ट्रिंग) पाठक [0] बनाम Convert.ToString (पाठक [0])
- 16. System.exit (0) बनाम JFrame.EXIT_ON_CLOSE
- 17. नई Backbone.Model() बनाम Backbone.Model.extend()
- 18. व्यू बनाम नई तालिका
- 19. HWND से IntPtr (CLI)
- 20. "% s"% प्रारूप बनाम "{0}"। प्रारूप() बनाम "?" प्रारूप
- 21. डीबीसेट के बनाम। नई इकाई बनाम बनाएं()
- 22. List.empty बनाम सूची() बनाम नई सूची()
- 23. बग बनाम एन्हांसमेंट बनाम नई सुविधा
- 24. IntPtr बाइट सरणी और वापस
- 25. माईफंक्शन() बनाम window.setTimeout ('MyFunction()', 0)?
- 26. ToString ("0") बनाम ToString (CultureInfo.InvariantCulture)
- 27. तंत्रिका नेटवर्क 0 बनाम -1
- 28. CoffeeScript "सरणी()" बनाम "नई सरणी()"
- 29. एक IntPtr और एक इंट
- 30. Win32 पर एक नई विंडो बनाई जाने पर मुझे कैसे सूचित किया जा सकता है?
'IntPtr.Zero' अधिक पठनीय है। मुझे लगता है कि इससे चिपकने वाला बेहतर होगा – user