2010-05-07 20 views
17

इस SO प्रश्न के लिए: What is the C# equivalent of friend?, मैंने व्यक्तिगत रूप से "आंतरिक" का जवाब दिया होगा, जैसे जा ने जवाबों में किया था! हालांकि, जॉन स्कीट का कहना है कि सी # में वीबी फ्रेंड का कोई प्रत्यक्ष समानता नहीं है। यदि जॉन स्कीट ऐसा कहता है, तो मैं अन्यथा नहीं कहूंगा! ; Pसी # आंतरिक वीएस वीबीएनईटी मित्र

मैं सोच रहा हूँ कि कीवर्ड internal (सी #) Friend (VBNET) के समकक्ष जब उनके संबंधित परिभाषाएं दी गई हैं नहीं किया जा सकता:

Friend VBNET

में Friend (Visual Basic) कीवर्ड घोषणा बयान निर्दिष्ट करता है कि तत्वों को उसी असेंबली के भीतर से एक्सेस किया जा सकता है, लेकिन असेंबली के बाहर से नहीं। [...]

internal C#

Internal: पहुँच वर्तमान विधानसभा तक सीमित है।

मेरी समझ के लिए, इन परिभाषाओं का मतलब मेरे जैसा ही है।

फिर, क्रमशः, जब मैं वीबीएनईटी में कोडिंग कर रहा हूं, तो मैं मित्र कीवर्ड का उपयोग यह निर्दिष्ट करने के लिए करता हूं कि एक वर्ग या संपत्ति केवल उस असेंबली के भीतर पहुंच योग्य होगी जहां इसे घोषित किया जाता है। सी # में वही, मैं इसे निर्दिष्ट करने के लिए आंतरिक कीवर्ड का उपयोग करता हूं।

  1. क्या मैं इस परिप्रेक्ष्य से कुछ या कुछ गलत कर रहा हूं?

  2. मुझे प्राप्त होने वाले परिशोधन क्या हैं?

  3. किसी को कृपया बताएं कि कैसे और किस मित्र और आंतरिक प्रत्यक्ष समकक्ष नहीं हैं?

आपके किसी भी उत्तर के लिए अग्रिम धन्यवाद!

उत्तर

23

मैंने कहा है कि सी ++ "मित्र" अवधारणा का कोई प्रत्यक्ष समकक्ष नहीं है। यह VB.NET Friend अवधारणा के समान नहीं है, जो वास्तव में सी # में internal के बराबर है।

संदर्भ महत्वपूर्ण है - यह न मानें कि एक ही शब्द सभी भाषाओं में बिल्कुल वही बात का मतलब है ... "स्थिर" एक क्लासिक उदाहरण :) है

+0

मुझे लगता है कि मुझे "दोस्त" कीवर्ड से भ्रमित हो गया है। विशेष रूप से जा के जवाब को पढ़ने के बाद जो "आंतरिक" है, और कहा जा रहा है कि यह सही नहीं था। तो, दोनों .NET की बात करते समय बराबर हैं, है ना? यह InternalsVisibleToAttribute बात क्या है? –

+1

@Will: क्षमा करें, आप सही हैं - वीबी में मित्र वास्तव में सी # में आंतरिक के बराबर है। यह उस प्रश्न में सही नहीं था, क्योंकि सवाल वीबी के बारे में नहीं था। यद्यपि मेरा जवाब यहां संपादित करेगा :) रिकॉर्ड के लिए, InternalsVisibleTo लगभग एक असेंबली को दूसरे के आंतरिक सदस्यों तक पहुंच की अनुमति है। –

+0

+1 आपके उत्तर के लिए जॉन धन्यवाद, और अन्य जिन्होंने भी टिप्पणी की। –

4

जॉन की (मूल) जवाब यह स्पष्ट है कि वह है कि बनाता है सी/सी ++ friend कीवर्ड का जिक्र करते हुए, जो किसी अन्य वर्ग में निजी पहुंच प्रदान करता है। सी # में कोई प्रत्यक्ष समतुल्य नहीं है, लेकिन परीक्षण के लिए बड़े पैमाने पर internal को अन्य असेंबली में विस्तारित करने का एक तरीका है।

जहां तक ​​मैं इसे समझता हूं, VB.Net Friend सी # internal जैसा ही है।

(मैंने ऊपर लिखा था जैसे जॉन ने यहां एक जवाब जोड़ा था।)

+0

+1 धन्यवाद! यह मेरे छोटे भ्रम को यहां बताता है। माफ़ कीजिये! =) –

+0

कोई अन्य असेंबली में "आंतरिक" कैसे बढ़ा सकता है? –

+0

@ विल: यही है 'InternalsVisibleTo' करता है। पढ़ें: http://blogs.msdn.com/james_world/archive/2005/07/07/436574.aspx –

2

प्रबंधित कोड में C++ मित्र कीवर्ड का मोटा समतुल्य है। हालांकि यह विधानसभा स्तर पर काम करता है, कक्षा स्तर नहीं। आप [InternalsVisibleTo] attribute का उपयोग कर सकते हैं।

+0

+1 InternsVisibleToAttribute के लिंक के लिए धन्यवाद! =) –

3

.NET भाषाओं की तुलना करते समय, वीबी के friend सी # के internal के बराबर होती है। मतलब, इस तरह के रूप में चिह्नित कुछ भी एक ही परियोजना/असेंबली के भीतर से ही पहुंचा जा सकता है। दृश्यता पर अधिक नियंत्रण के लिए इसे protected के साथ जोड़ा जा सकता है।

InternalsVisibleTo विशेषता परीक्षण उद्देश्यों के लिए उपयोगी हो सकती है; नाम के बावजूद, यह वीबी पर लागू होता है जितना सी # के साथ करता है। यह ध्यान दिया जाना चाहिए कि वीबी ने InternalsVisibleTo के उपयोग को समर्थन नहीं दिया जब तक कि .NET 4.

+0

+1 यह उल्लेख करने के लिए कि VBNET ने .NET 4.0 तक InternalsVisibleTo का समर्थन नहीं किया है। आपके उत्तर के लिए धन्यवाद! =) VB.NET 4 टिप्पणी के लिए –

+0

+1। – MarqueIV

+0

-1 वीबी के लिए .NET 4 टिप्पणी की आवश्यकता है: मेरे पास एक वीएस 2 के 8 वीबी प्रोजेक्ट और वीबी टेस्ट प्रोजेक्ट है जो इंटरनलस विजिबल के साथ पूर्व में जुड़ा हुआ है जो इसके बिना काम नहीं करता है। (अलग-अलग असंबंधित सार्वजनिक सुविधा है जो _Accessor प्रकार बनाती है जो इसे कुछ हद तक अनावश्यक बनाती है लेकिन यह फिर भी काम करती है।) एमएसडीएन पेज पर टिप्पणी का कहना है कि यह वीएस 2 के 5 में वीबी.नेट के साथ काम नहीं करता है। सही चेतावनी यह VB.NET 8 - VS2k5 - और नीचे समर्थित नहीं है। यह वीबीएनईटी 9 - वीएस 2 के 8 - और ऊपर द्वारा .NET 2.0 के साथ समर्थित है। –