Pregunta

Como ya sabrá, el protegido interno del Framework .NET. / em> el modificador de acceso funciona de una manera extraña: no significa que la clase esté protegida Y interna , dice la clase está protegida O interna ; es decir, se puede acceder a la clase o al miembro modificado desde el mismo conjunto así como desde la misma jerarquía.

Entonces, sabiendo esto: ¿Cuándo lo usarías? ¿Puede dar un ejemplo? ¿Hay un buen ejemplo de uso esclarecedor dentro de la Biblioteca de clases base de .NET?

¿Fue útil?

Solución

Rara vez he necesitado usar esta combinación de modificador de acceso, ya que creo que en todas las circunstancias, excepto en las más extremas, es un indicador de diseño deficiente. Sin embargo, a veces es necesario que las clases auxiliares, como los convertidores de tipos y los editores, accedan al método dentro de su ensamblaje, pero solo permiten que las clases derivadas accedan a él en otros casos de uso.

Un ejemplo podría ser una llamada que convierte un tipo en una cadena para el convertidor de tipos. ToString () generalmente no se usa para este propósito, por lo que puede tener una llamada a ToPersistableString () que desea que use su convertidor de tipo, por lo que la hace interno. Luego, decide que las personas que se derivan de su clase pueden querer usar esta llamada como parte de su propio esquema de persistencia para su clase derivada, por lo que también lo hace protected .

Uso de .NET Framework
AccessibilityNotifyClients en Control es protegido interno . Al utilizar Reflector , puedo ver que esto se hizo para que el CheckedItemCollection de CheckListBox podría tener acceso al cambiar los estados marcados.

Otros consejos

Lo he usado para métodos internos que deseaba poder usar en un espacio de nombres separado para pruebas de unidad, el espacio de nombres de prueba de unidad contenía una subclase de la clase. lo que permitió el acceso a los métodos protegidos.

Dicho esto, hay un argumento para hacer que todo sea público para las pruebas unitarias.

Me gustaría agregar un ejemplo del marco MVC de ASP.Net:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top