Когда бы вы использовали «защищенный внутренний» модификатор доступа? - PullRequest
18 голосов
/ 15 октября 2008

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

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

Ответы [ 3 ]

8 голосов
/ 15 октября 2008

Мне редко приходилось использовать эту комбинацию модификаторов доступа, так как я думаю, что во всех случаях, кроме самых экстремальных, это показатель плохого дизайна. Однако иногда необходимо, чтобы вспомогательные классы, такие как преобразователи типов и редакторы, обращались к методу внутри вашей сборки, но разрешали доступ к нему только производным классам в других случаях использования.

Примером может служить вызов, который превращает тип в строку для преобразователя типов. ToString() обычно не используется для этой цели, поэтому у вас может быть вызов ToPersistableString(), который вы хотите использовать в вашем конвертере типов, поэтому вы можете сделать его internal. Затем вы решаете, что люди, происходящие из вашего класса, вполне могут захотеть использовать этот вызов как часть своей собственной схемы персистентности для своего производного класса, поэтому вы также сделаете его protected.

.NET Framework Use
AccessibilityNotifyClients на Control - это protected internal. Используя Reflector , я вижу, что это было сделано для того, чтобы CheckedItemCollection из CheckListBox мог получить к нему доступ при изменении проверенных состояний.

2 голосов
/ 15 октября 2008

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

Тем не менее, есть аргумент, чтобы сделать все общедоступным для модульного тестирования.

1 голос
/ 12 февраля 2012

Я хотел бы добавить пример из ASP.Net MVC framework:

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 */);
        }

}
...