एक आंतरिक वर्ग पर सार्वजनिक बनाम आंतरिक तरीके


82
internal class Foo
{
  public void Fee()
  {
    Debug.WriteLine("Fee");
  }

  internal void Fi()
  {
    Debug.WriteLine("Fi");
  }
}

मुझे लगता है कि शुल्क () और फाई () समान रूप से सुलभ हैं क्योंकि पूरी कक्षा पहले से ही आंतरिक है। क्या मैं कुछ देख रहा हूँ? क्या इस तरह के मामले में तरीकों के लिए सार्वजनिक या आंतरिक चुनने का कोई कारण है?


2
@EricLippert ने आज अपनी राय रखी। ericlippert.com/2014/09/15/internal-or-public/#more-2353
ScottS

जवाबों:


97

internal class Fooघोषणा की पहुंच को पार कर जाएगी public void Fee()विधि, प्रभावी रूप से यह आंतरिक बना रही है।

इस मामले में, विधियों पर आंतरिक बनाम सार्वजनिक का उपयोग करने का समान प्रभाव होगा। एकमात्र कारण मैं एक मामले में सार्वजनिक तरीकों बनाम आंतरिक तरीकों का चयन करूंगा, इस तरह से भविष्य के संस्करण में एक सार्वजनिक वर्ग के लिए संक्रमण को कम करना आसान होगा, क्या आपको ऐसा करने का चयन करना चाहिए।


36

यहाँ केवल एक ही बात याद आ रही है कि आप ऐसा क्यों करेंगे?

कुछ पुस्तकालयों में बहुत सारी कक्षाएं होती हैं जो पुस्तकालय के उपभोक्ता को छूने के लिए नहीं होती हैं, लेकिन उन्हें सार्वजनिक रूप से चिह्नित इंटरफ़ेस विरासत में प्राप्त करना चाहिए। उदाहरण के लिए, मेरे पास एक वर्ग है जिसमें IComparer इंटरफ़ेस विरासत में है, लेकिन इसका केवल आंतरिक रूप से उपयोग किया जाता है और मैं अपने पुस्तकालय के सार्वजनिक पहलू को अव्यवस्थित नहीं करना चाहता। यदि मैं कार्यान्वित किए गए फ़ंक्शन की तुलना करता हूं, तो आंतरिक के रूप में कंपाइलर शिकायत करता है कि मैं इंटरफ़ेस IComparer को आरोपित नहीं कर रहा हूं।

तो मैं इंटरफ़ेस को सफलतापूर्वक कैसे लागू करूं और उसी समय इसे अपने पुस्तकालय के सार्वजनिक पहलू में सुलभ होने से रोकूं? वर्ग को आंतरिक लेकिन कार्यान्वित फ़ंक्शन को सार्वजनिक रूप में चिह्नित करें।


30

वास्तव में - यदि आप प्रतिबिंब का उपयोग कर रहे हैं तो एक बड़ा अंतर है; विशेष रूप से, सिल्वरलाइट बहुत परेशान हो सकता है यदि आप प्रतिबिंब के माध्यम से आंतरिक तरीकों की कोशिश करते हैं और एक्सेस करते हैं, भले ही आपके पास एक्सेस हो। मैंने ऐसे अवसर देखे हैं जब मुझे सिल्वरलाइट पर कोड काम करने के लिए एक विधि को सार्वजनिक करना पड़ा है, भले ही यह नियमित रूप से .NET पर काम करता हो।

आप नियमित रूप से .NET में आंशिक विश्वास के साथ ही मिल सकते हैं।


3
ये इस तरह के गंदे विवरण हैं जिनकी मुझे हमेशा से दिलचस्पी रही है। हालांकि, आम तौर पर अगर कोई मेरी कक्षाओं में छिपे हुए सदस्यों तक पहुंचने के लिए प्रतिबिंब का उपयोग कर रहा है, तो मुझे चिंता नहीं होगी अगर यह उनके लिए मुश्किल है।
5

1
@ScottS - कभी-कभी आप अपने स्वयं के प्रकारों को प्रतिबिंबित कर रहे हैं - यानी जहां आप सामान्य रूप से आंतरिक विधि तक पहुंच पाएंगे, लेकिन अचानक आप नहीं करते हैं।
मार्क Gravell

9

जब आप अपने आंतरिक वर्ग को इंटरफ़ेस लागू करना चाहते हैं तो इससे फर्क पड़ेगा। जो विधि कुछ इंटरफ़ेस का कार्यान्वयन है, उसे सार्वजनिक करना होगा।


7

आप सही हैं, शुल्क और फाई दोनों समान रूप से सुलभ होंगे।

CSharp भाषा विशिष्टता 3.0 से, 3.5.2 से कम:

एक नेस्टेड मेंबर एम की एक्सेसिबिलिटी डोमेन को एक प्रोग्राम P के भीतर टाइप T में घोषित किया गया है जिसे निम्नानुसार परिभाषित किया गया है (यह देखते हुए कि एम खुद संभवतः एक टाइप हो सकता है):

• यदि M की घोषित पहुंच सार्वजनिक है, तो M की पहुंच डोमेन T की पहुंच-योग्य डोमेन है।

इसलिए, भले ही शुल्क को सार्वजनिक घोषित किया जाता है, यह फू (यानी आंतरिक) के रूप में सुलभ होगा।


3

Msdn प्रलेखन के अनुसार आपकी Foo क्लास आपकी असेंबली के बाहर प्रशंसनीय नहीं होगी, इसलिए इन विधियों को आंतरिक या सार्वजनिक रूप से चिह्नित करने से कोई अंतर नहीं पड़ता है; यहां तक ​​कि यह गुण अंतरक्षत्रीय अदृश्य का उपयोग करके कोई फर्क नहीं पड़ता है


1

मैं केवल आंतरिक विधियों के साथ जाऊंगा यदि कोई वर्ग आंतरिक है। यदि आप अपना दिमाग बदलते हैं और कक्षा को सार्वजनिक करते हैं तो आप केवल एक पाठ की जगह ले सकते हैं और आप कर रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.