внутрішній проти загальнодоступного в c #


92

Я хочу знати різницю між модифікаторами видимості publicта internal.

Коли ми повинні використовувати internalклас і коли public? Мене бентежить, коли метод повинен бути publicабо internal.

Я читав, що internalдоступ до них здійснюється через Асамблею, а publicтакож може бути використаний через Асамблею, де різниця полягає.

Відповіді:


101

public видно звідки завгодно.

internal видно лише в межах збірки

Ви, як правило, використовуєте внутрішній лише для захисту внутрішніх API. Наприклад, ви можете виявити кілька перевантажень методу:

public int Add(int x, int y)
public int Add(int x,int y, int z)

Обидва вони викликають внутрішній метод

internal int Add(int[] numbers)

Потім ви можете додати багато вишуканості методу, але "захистити" його, використовуючи фасадні методи, які можуть допомогти програмісту правильно викликати метод. (Наприклад, метод реалізації з параметром масиву може мати довільне обмеження значень.)

Також варто зазначити, що за допомогою Reflection будь-які методи можна викликати незалежно від їх видимості. Ще один "хак" для управління / отримання доступу до внутрішньо прихованих API.


5
у внутрішньому класі я можу оголосити загальнодоступні методи ..?
NoviceToDotNet

Ні, оскільки це може спричинити конфлікт. Компілятор розповість вам про це і не зможе скомпілювати.
X

14
@ Program.X: Насправді, ти можеш, а компілятор нічого тобі не говорить.
АБО Mapper

Насправді я прийшов сюди, гуглюючи, чи це насправді є особливістю. Уявіть, як скласти клас internalі всі методи public. Якщо вам потрібна краща видимість, ви можете налаштувати весь клас publicзнову. Але я не впевнений, чи призначений він для використання таким чином чи ні. Тому я продовжую ... вдаючись до допомоги редагування і вуаля, цю ж тему: stackoverflow.com/questions/9302236 / ...
ecth

31

internalкорисно, коли ви хочете оголосити учасника або ввести всередині DLL, а не поза цим ...
зазвичай, коли ви оголошуєте учасника, оскільки Publicможете отримати доступ до цього з інших бібліотек DLL. але, якщо вам потрібно було оголосити щось загальнодоступним безпосередньо у вашій бібліотеці класів, ви можете оголосити це як Internal.
у формальному визначенні: внутрішні члени видно безпосередньо всередині поточної збірки ...


11

internalтакож корисний при написанні модульних тестів. InternalsVisibleToАтрибут давайте ваші тестові збірки доступу внутрішні методи в коді збірки. Тобто ви можете перевірити методи, які здаються приватними для зовнішнього світу, не використовуючи рефлексії.


6

Громадський доступ також доступний за межами асамблеї. Отже, коли у вас є клас, до якого не слід отримувати доступ, кожен клас у збірці повинен мати доступ до нього, тоді внутрішній - це правильно. Якщо вам потрібен зовнішній доступ, використовуйте загальнодоступний.


4

Крім того, властивості, позначені як, internalвидаватимуть BindingExpression path errorif, якщо вони використовуються для DataBinding у WPF. Отже, це повинно бути publicдля того, щоб працювати належним чином, навіть коли DataBinding відбувається в рамках тієї самої збірки.


-3

Якщо ви можете посилатися на асемблер ззовні, у вас є сфера внутрішніх та загальнодоступних класів

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.