2009-09-21 15 views
48

मैं अतुल्यकालिक रूप से चलाने के लिए सेटअप ReadFile कोशिश कर रहा हूँ और MSDN के अनुसार, मैं स्थापित करने के लिए lpNumberOfBytesReadnull करने की जरूरत है: "। इस पैरामीटर के लिए शून्य का प्रयोग करता है, तो यह एक अतुल्यकालिक आपरेशन संभावित गलत परिणाम से बचने के लिए है"IntPtr.Zero शून्य के बराबर है?

उदाहरण के लिए

, अगर मैं निम्नलिखित है:

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    public static extern bool ReadFile(
    IntPtr hFile, 
    out byte[] aBuffer, 
    int cbToRead, 
    IntPtr cbThatWereRead, 
    ref OVERLAPPED pOverlapped 
); 

और मैं इस तरह इसे कहते (4 पैरामीटर अशक्त किया जा रहा होने के इरादे से):

Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped); 

इच्छा है कि इसे शून्य के साथ बुलाओ जैसा ही हो? यदि नहीं, तो घोषणा में या फ़ंक्शन कॉल में मुझे क्या बदलना चाहिए?

मैं अगर मैं hFile संदर्भ के लिए SafeHandle या HandleRef बजाय IntPtr का उपयोग करना चाहिए भी उत्सुक था? मुझे यह सुनिश्चित करना है कि मैं CloseHandle(IntPtr) के साथ हैंडल को बंद कर दूं, जब मैं इसके साथ कर रहा हूं, तो सुनिश्चित करें कि IntPtr पर अन्य दो विकल्पों का उपयोग करने का कोई कारण नहीं है। मैं असुरक्षित कोड का उपयोग करने से बचने की कोशिश भी कर रहा हूं।

संपादित करें: जैसा कि यह पता चला है, मुझे चौथे पैरामीटर को IntPtr.Zero पर सेट नहीं करना चाहिए, क्योंकि मैं असीमित रूप से चल रहा हूं, फिर भी यह अभी भी वापस आ सकता है। Asynchronous Disk I/O देखें। आह, मुझे कहानियों के विरोधाभास से प्यार है।

उत्तर

60

आपके द्वारा सूचीबद्ध किए गए पी/आमंत्रण उद्देश्यों के लिए, आपको के स्थान पर IntPtr.Zero का उपयोग करना चाहिए। ध्यान दें कि यह सी # null कीवर्ड के बराबर नहीं है, हालांकि।

6

आप मूल्य-प्रकार पर शून्य निर्दिष्ट नहीं कर सकते हैं। एक संदर्भ-प्रकार शून्य हो सकता है, जैसा कि किसी ऑब्जेक्ट इंस्टेंस का जिक्र नहीं करता है, लेकिन मान-प्रकार के पास हमेशा एक मान होता है।

IntPtr.Zero केवल एक निरंतर मान है जो एक शून्य सूचक का प्रतिनिधित्व करता है।

6

जानते हैं कि एक बग (फीचर ??) सी #> = 2.0 में, जहां

if (IntPtr.Zero == null) 
{ 
    // Won't enter here 
} 

सही ढंग से संकलित कर देगा यह है कि हो सकता है, लेकिन यह कभी if में प्रवेश नहीं करेगा।

Microsoft connect पर एक बग खुला है लेकिन यह काफी पुराना है और माइक्रोसॉफ्ट कर्मियों से कोई टिप्पणी नहीं है।

+12

पिछली पोस्ट के लिए खेद है, लेकिन यह एक बग नहीं है क्योंकि IntPtr.Zero शून्य के बराबर नहीं है - ताकि अगर कथन काम नहीं करेगा। – Kobunite

+0

@ कोबुनिट फिर 'if (IntPtr.Zero == "हैलो") लिखने का प्रयास करें और देखें कि क्या होता है। एक संकलन-समय त्रुटि होगी ... समस्या यह है कि कोई चेतावनी नहीं है कि तुलना असंभव है, और कोई त्रुटि नहीं है। कोड बस संकलक द्वारा हटा दिया जाता है। आईएल कोड जेनरेट किया गया http://goo.gl/6zpPxN – xanatos

+0

नेक्रो के लिए खेद है, लेकिन यह संकलित करता है क्योंकि यह '==' ऑपरेटर ओवरलोड को प्रभावी रूप से '(IntPtr?) IntPtr.Zero == (IntPtr?) null' – Marc

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