Quando você usaria o modificador de acesso “interno protegido”?
-
03-07-2019 - |
Pergunta
Como você já deve saber, o .NET Framework é interna protegida modificador de acesso funciona de uma forma estranha: isso não significa que a classe é protegido E interno , diz a classe é protegido ou interno ; ou seja, a classe ou membro modificado pode ser acedido a partir do mesmo conjunto whitin
Assim, sabendo isto: Quando você usá-lo? Você pode dar um exemplo? Existe um bom, iluminando exemplo de uso dentro Biblioteca de classes .NET Base?
Solução
Eu raramente necessário usar esta combinação acesso modificador como eu acho que em todos, mas a maioria das circunstâncias extremas, é um indicador de má concepção. No entanto, às vezes é necessário ter auxiliares aulas como conversores de tipo e editores acessar o método dentro de sua montagem, mas apenas permitir que as classes derivadas para acessá-lo em outros casos de uso.
Um exemplo pode ser uma chamada que transforma um tipo em uma string para o conversor de tipo. ToString()
geralmente não é usado para este fim, assim você pode ter uma chamada ToPersistableString()
que você quiser que o seu conversor de tipo para uso, assim você faz internal
. Então você decide que as pessoas decorrentes da sua classe pode muito bem querer usar esta chamada como parte do seu próprio esquema de persistência para sua classe derivada para que você torná-lo protected
também.
.NET Framework Use
AccessibilityNotifyClients
em Control
é protected internal
. Usando refletor , eu posso ver que isso foi feito para que o CheckedItemCollection
de CheckListBox
poderia acessá-lo quando mudar estados verificados.
Outras dicas
Eu usei-o para os métodos internos que você queria ser capaz de usar em um espaço de nome separado para teste de unidade, o espaço de nome de teste de unidade continha uma subclasse da classe. que permitiu que os métodos protegidos para ser acedida.
Dito isto, há um argumento para tornar tudo público para testes de unidade.
Eu gostaria de adicionar um exemplo do quadro 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 */);
}
}