Подтвердить что ты не робот

Когда вы будете использовать "защищенный внутренний" модификатор доступа?

Как вы уже знаете, модификатор доступа .NET Framework защищен внутренним работает странным образом: это не значит, что класс protected И, он говорит, что класс защищен OR внутренним; то есть к модифицированному классу или члену можно получить доступ из одной и той же сборки , а также из той же иерархии.

Итак, зная это: когда вы его используете? Можете ли вы привести пример? Есть ли хороший, освещающий пример использования в библиотеке базового класса .NET?

4b9b3361

Ответ 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 */);
        }

}