2015-11-19 6 views
13

क्या सी # से सी ++ के पैरामीटर पास करते समय [इन, आउट] और केवल रेफरी का उपयोग करने के बीच कोई अंतर है?सी # में पिनवोक का उपयोग करते समय [इन, आउट] और रेफरी के बीच क्या अंतर है?

मुझे कुछ अलग एसओ पोस्ट और एमएसडीएन से कुछ सामान मिल गया है, साथ ही यह मेरे प्रश्न के करीब आता है लेकिन इसका काफी जवाब नहीं है। मेरा अनुमान है कि मैं सुरक्षित रूप से रेफरी का उपयोग कर सकता हूं जैसे कि मैं [इन, आउट] का उपयोग करता हूं, और यह कि मार्शलर अलग-अलग कार्य नहीं करेगा। मेरी चिंता यह है कि यह अलग-अलग कार्य करेगा, और सी ++ मेरे सी # संरचना को पारित होने से खुश नहीं होगा। मैं दोनों चीजों कोड बेस मैं में काम कर रहा हूँ में किया देखा है ...

यहाँ पदों मैंने पाया और के माध्यम से पढ़ रहे हैं:

Are P/Invoke [In, Out] attributes optional for marshaling arrays? बनाता है मुझे लगता है कि मैं का उपयोग करना चाहिए [ अंदर बाहर]।

इन तीन पदों मुझे लगता है कि मैं का उपयोग करना चाहिए [में, बाहर] बनाने के लिए, लेकिन मैं रेफरी के बजाय का उपयोग कर सकते हैं और यह एक ही होगा कि मशीन कोड। इससे मुझे लगता है कि मैं गलत हूं - इसलिए यहां पूछना।

+0

क्या आप कृपया एक ठोस उदाहरण दे सकते हैं। क्या आप '[इन, आउट] रेफ इंट फू 'और' रेफ इंट फू 'के बीच का अंतर जानना चाहते हैं? जैसा कि यह खड़ा है, आपके प्रश्न में विस्तार की कमी है, और मेरा मानना ​​है कि आपको एक (या अधिक) ठोस उदाहरणों की आवश्यकता है। –

+0

कुछ ऐसा है, है: [DllImport ("MyDll.dll", कॉलिंग कन्वेंशन = कॉलिंग कन्वेंशन.सीडीसीएल)] निजी स्थैतिक बाहरी बूल मायफंक्शन ([इन, आउट] कुछ स्ट्रक्चर [] एस्ट्रक्चर; [इन के स्थान पर रेफरी का उपयोग करने जैसा ही है , आउट] – PerryC

+0

इसके अलावा, क्या आपने अभी [इन, आउट] और रेफरी गठबंधन किया है?)? – PerryC

उत्तर

14

ref या out का उपयोग मनमाने ढंग से नहीं है। यदि मूल कोड को पास-बाय-रेफरेंस (एक पॉइंटर) की आवश्यकता होती है तो पैरामीटर प्रकार एक मान प्रकार होने पर उन कीवर्ड का उपयोग करना चाहिए। ताकि जिटर मूल्य के लिए एक सूचक उत्पन्न करने के लिए जानता है। और उन्हें छोड़ दें यदि पैरामीटर प्रकार एक संदर्भ प्रकार (वर्ग) है, तो ऑब्जेक्ट पहले से ही हुड के नीचे पॉइंटर्स हैं।

[इन] और [आउट] विशेषताओं को पॉइंटर्स के बारे में अस्पष्टता को हल करने के लिए आवश्यक हैं, वे डेटा प्रवाह निर्दिष्ट नहीं करते हैं। [इन] हमेशा पिनवोक मार्शलर द्वारा निहित किया जाता है इसलिए इसे स्पष्ट रूप से वर्णित नहीं किया जाना चाहिए। लेकिन आप का उपयोग [आउट] कर सकते हैं यदि आप मूल कोड द्वारा किसी कोड या क्लास सदस्य को आपके कोड में वापस किए गए किसी भी बदलाव को देखने की अपेक्षा करते हैं। पिनवोक मार्शलर व्यय से बचने के लिए स्वचालित रूप से वापस कॉपी करने से बचाता है।

एक और प्रश्नोत्तरी यह है कि [आउट] अक्सर आवश्यक नहीं है। ऐसा होता है जब मान blittable है, एक महंगा शब्द जिसका अर्थ है कि प्रबंधित मान या ऑब्जेक्ट लेआउट देशी लेआउट के समान है। पिनवोक मार्शलर ऑब्जेक्ट को पिन करने और प्रबंधित ऑब्जेक्ट स्टोरेज में पॉइंटर पास करने के लिए शॉर्टकट ले सकता है। मूल रूप से प्रबंधित ऑब्जेक्ट को सीधे संशोधित करने के बाद से आप अनिवार्य रूप से परिवर्तन देखेंगे।

कुछ सामान्य रूप से आप दृढ़ता से आगे बढ़ना चाहते हैं, यह बहुत ही कुशल है। आप [स्ट्रक्चरलाइट (लेआउटकिंड.Sequential)] विशेषता को टाइप करके मदद करते हैं, यह एक अनुकूलन को दबाता है जो सीएलआर सबसे छोटी वस्तु प्राप्त करने के लिए फ़ील्ड को पुनर्व्यवस्थित करने के लिए उपयोग करता है। और साधारण मूल्य प्रकारों या निश्चित आकार बफर के केवल फ़ील्ड का उपयोग करके, हालांकि आपके पास अक्सर वह विकल्प नहीं होता है। बूल का उपयोग न करें, इसके बजाय बाइट का उपयोग करें। यह पता लगाने का कोई आसान तरीका नहीं है कि कोई प्रकार धुंधला है या नहीं, इसके अलावा सही तरीके से काम नहीं कर रहा है या डीबगर का उपयोग करके और सूचक मूल्यों की तुलना करें।

बस जब आप की आवश्यकता हो तो स्पष्ट और हमेशा [आउट] का उपयोग करें। अगर यह जरूरी नहीं है तो इसका कोई खर्चा नहीं होता है। और यह स्वयं दस्तावेज है।और आप अच्छा महसूस कर सकते हैं कि मूल कोड की वास्तुकला में बदलाव होने पर यह अभी भी काम करेगा।

+0

मुझे यकीन है कि मेरी वस्तुएं धुंधली नहीं हैं (हालांकि मैं सकारात्मक नहीं हूं)। अगर मेरे पास कुछ ऐसा है जो वर्तमान में [इन, आउट] है, तो इसे [आउट] क्लीनर कोड का उपयोग करने के लिए बदल देगा और वैसे ही व्यवहार करेगा? या दो-तरफा इरादे दिखाने के लिए [इन, आउट] विशेषता छोड़ने के लिए क्लीनर कोड होगा? आपके उत्तर के लिए धन्यवाद। – PerryC

+2

यदि दो-तरफा इरादा है तो उस तरीके का वर्णन करें, * * * [आउट, आउट] का उपयोग करें। –

+0

यदि मान ब्लिटेबल है और संदर्भ प्रकार नहीं है (इस मामले में, सी # में एक स्ट्रक्चर), [इन, आउट] काम का उपयोग करने के बजाय रेफरी का उपयोग करेगा, यह देखते हुए कि संरचना अनुक्रमिक है और इसमें केवल आदिम प्रकार हैं (int, float, डबल)? क्या यह [इन, आउट] मार्शलर के उपयोग के समान होगा क्योंकि किसी भी मामले में यह वस्तु को स्मृति में पिन करेगा? – PerryC

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