您可能已经知道,.NET Framework 的protected internal访问修饰符以一种奇怪的方式工作:这并不意味着该类是protected AND internal,它表示该类是protected OR internal;也就是说,修改后的类或成员可以从同一程序集以及同一层次结构中访问。
所以,知道这一点:你什么时候使用它?能给我举个例子吗?.NET 基类库中是否有一个很好的、有启发性的使用示例?
您可能已经知道,.NET Framework 的protected internal访问修饰符以一种奇怪的方式工作:这并不意味着该类是protected AND internal,它表示该类是protected OR internal;也就是说,修改后的类或成员可以从同一程序集以及同一层次结构中访问。
所以,知道这一点:你什么时候使用它?能给我举个例子吗?.NET 基类库中是否有一个很好的、有启发性的使用示例?
我很少需要使用这种访问修饰符组合,因为我认为除了最极端的情况外,它是设计不佳的一个指标。但是,有时需要让类型转换器和编辑器等辅助类访问程序集中的方法,但只允许派生类在其他用例中访问它。
一个示例可能是将类型转换为类型转换器的字符串的调用。ToString()
通常不用于此目的,因此您可能有一个ToPersistableString()
希望您的类型转换器使用的调用,因此您调用它internal
。然后,您决定从您的类派生的人很可能希望将此调用用作他们自己的派生类持久性方案的一部分,因此您也可以这样protected
做。
.NET Framework 上使用
AccessibilityNotifyClients
的Control
是protected internal
. 使用Reflector,我可以看到这样做是为了在更改检查状态时可以访问它CheckedItemCollection
。CheckListBox
我已将它用于您希望能够在单独的名称空间中用于单元测试的内部方法,单元测试名称空间包含该类的子类。这允许访问受保护的方法。
也就是说,有一个论点是公开所有内容以进行单元测试。
我想从 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 */);
}
}