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 , bem como da mesma hierarquia.

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?

Foi útil?

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

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top