Когда вы будете использовать "защищенный внутренний" модификатор доступа?
Как вы уже знаете, модификатор доступа .NET Framework защищен внутренним работает странным образом: это не значит, что класс protected И, он говорит, что класс защищен OR внутренним; то есть к модифицированному классу или члену можно получить доступ из одной и той же сборки , а также из той же иерархии.
Итак, зная это: когда вы его используете? Можете ли вы привести пример? Есть ли хороший, освещающий пример использования в библиотеке базового класса .NET?
Ответы
Ответ 1
Мне редко нужно было использовать эту комбинацию модификаторов доступа, поскольку я думаю, что во всех, кроме самых экстремальных условиях, это показатель плохого дизайна. Однако иногда необходимо, чтобы вспомогательные классы, такие как преобразователи типов и редакторы, обращались к методу внутри вашей сборки, но только позволяют производным классам обращаться к нему в других случаях использования.
Примером может быть вызов, который превращает тип в строку для конвертера типов. ToString()
обычно не используется для этой цели, поэтому у вас может быть вызов ToPersistableString()
, который вы хотите использовать для конвертера вашего типа, поэтому вы делаете его internal
. Затем вы решаете, что люди, происходящие из вашего класса, могут захотеть использовать этот вызов как часть своей собственной схемы сохранения для своего производного класса, поэтому вы также делаете его protected
.
Использование .NET Framework
AccessibilityNotifyClients
on Control
- protected internal
. Используя Reflector, я вижу, что это было сделано так, чтобы CheckedItemCollection
of CheckListBox
мог получить к нему доступ при изменении отмеченных состояний.
Ответ 2
Я использовал его для внутренних методов, которые вы хотели использовать в отдельном пространстве имен для модульного тестирования, пространство имен unit test содержало подкласс класса. что позволило доступ к защищенным методам.
Это говорит о том, что есть аргумент, чтобы сделать все публичным для модульного тестирования.
Ответ 3
Я хотел бы добавить пример из структуры ASP.Net MVC:
public abstract class Controller : ControllerBase, <Omitted Interfaces>
{
protected internal ViewResult View() {
return View(null /* viewName */, null /* masterName */, null /* model */);
}
protected internal ContentResult Content(string content) {
return Content(content, null /* contentType */);
}
}