您何时使用“受保护的内部”访问修饰符?

时间:2008-10-15 15:26:56

标签: .net encapsulation access-modifiers

您可能已经知道,.NET Framework的protected internal访问修饰符以一种奇怪的方式工作:它并不意味着该类是受保护的 AND 内部,它表示该类受保护 内部;也就是说,修改后的类或成员可以从同一个程序集以及从同一层次结构中访问。

所以,知道这个:你什么时候使用它?你能给我举个例子吗? .NET基类库中是否有一个很好的,有启发性的用法示例?

3 个答案:

答案 0 :(得分:8)

我很少需要使用这种访​​问修饰符组合,因为我认为除了最极端的情况之外,它都是设计不佳的指标。但是,有时需要让类型转换器和编辑器等辅助类访问程序集中的方法,但只允许派生类在其他用例中访问它。

示例可能是将类型转换为类型转换器的字符串的调用。 ToString()通常不会用于此目的,因此您可能需要ToPersistableString()调用您希望类型转换器使用的内容,因此您需要internal。然后你决定从你的类派生的人可能希望将这个调用作为他们自己的派生类的持久性方案的一部分,所以你也可以使它protected

.NET Framework使用
AccessibilityNotifyClients上的Controlprotected internal。使用Reflector,我可以看到已完成此操作,以便CheckedItemCollection CheckListBox可以在更改已检查状态时访问它。

答案 1 :(得分:2)

我已将它用于您希望能够在单独的名称空间中进行单元测试的内部方法,单元测试名称空间包含该类的子类。这允许访问受保护的方法。

这就是说有一个论点要求公开单元测试。

答案 2 :(得分:1)

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

}