публічні проти внутрішніх методів на внутрішньому класі


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

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

Я думаю, що Fee () та 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

Насправді - є велика різниця, якщо ви використовуєте рефлексію; зокрема, Silverlight може сильно засмутитися, якщо ви спробуєте отримати доступ до внутрішніх методів за допомогою роздумів, навіть якщо б у вас був доступ. Я бачив випадки, коли мені доводилося робити метод загальнодоступним, щоб змусити код працювати на Silverlight, хоча він працює і на звичайному .NET.

Ви можете знайти те саме з частковою довірою до звичайного .NET.


3
Це такі брудні деталі, які мене завжди цікавлять. Хоча, як правило, якщо хтось використовує відображення для доступу до прихованих учасників у моїх класах, я не буду хвилюватися, якщо їм це важко.
ScottS

1
@ScottS - іноді ви розмірковуєте над власними типами - тобто там, де ви зазвичай мали б доступ до внутрішнього методу, але раптом цього немає.
Марк Гравелл

9

Було б важливо, коли ви хочете, щоб ваш внутрішній клас реалізував інтерфейс. Метод, який є реалізацією певного інтерфейсу, повинен бути публічним.


7

Ви маєте рацію, і Комісія, і Фі будуть однаково доступні.

З мовної специфікації CSharp 3.0, під 3.5.2:

Домен доступності вкладеного члена M, оголошеного в типі T в програмі P, визначається наступним чином (зазначаючи, що сам M може бути типом):

• Якщо заявлена ​​доступність M є загальнодоступною, домен доступності M є доменом доступності T.

Отже, навіть якщо Плата буде оголошена загальнодоступною, вона буде настільки ж доступною, як Foo (тобто внутрішня).


3

Згідно з документацією msdn, ваш клас Foo не буде доступний за межами вашої збірки, тому не має значення, щоб позначати методи як внутрішні або загальнодоступні; це навіть не має значення, використовуючи Attribute InternalsVisibleTo


1

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

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