Question

Comme vous le savez peut-être déjà, protected interne Le modificateur d'accès fonctionne d'une manière étrange: cela ne signifie pas que la classe est protégée ET interne , dit-il la classe est protégée OU interne ; En d’autres termes, vous pouvez accéder à la classe ou au membre modifié à partir du même ensemble , ainsi que à partir de la même hiérarchie.

Alors, sachant ceci: quand l'utiliseriez-vous? Pouvez-vous donner un exemple? Existe-t-il un bon exemple d'utilisation éclairant dans la bibliothèque de classes .NET Base?

Était-ce utile?

La solution

J’ai rarement eu besoin d’utiliser cette combinaison de modificateur d’accès, car j’estime que, sauf dans les circonstances les plus extrêmes, c’est un indicateur de mauvaise conception. Cependant, il est parfois nécessaire que des classes auxiliaires telles que des convertisseurs de types et des éditeurs accèdent à la méthode dans votre assemblage, mais autorisent uniquement les classes dérivées à y accéder dans d'autres cas d'utilisation.

Un exemple pourrait être un appel qui transforme un type en chaîne pour le convertisseur de type. ToString () n'est généralement pas utilisé à cette fin; vous pouvez donc avoir un appel ToPersistableString () que vous souhaitez que votre convertisseur de type utilise, de sorte que vous le fassiez . interne . Vous décidez ensuite que les personnes issues de votre classe peuvent très bien vouloir utiliser cet appel dans le cadre de leur propre schéma de persistance pour leur classe dérivée, afin que vous le rendiez également protected .

Utilisation du .NET Framework
AccessibilityNotifyClients sur Control est interne protégé . En utilisant Reflector , je constate que cela a été fait de sorte que le CheckedItemCollection de CheckListBox pourrait y accéder lors de la modification des états cochés.

Autres conseils

Je l'ai utilisé pour des méthodes internes que vous souhaitez pouvoir utiliser dans un espace de noms distinct pour le test d'unité, l'espace de noms d'un test d'unité contenant une sous-classe de la classe. qui permettait d'accéder aux méthodes protégées.

Cela dit, il existe un argument pour rendre tout public pour les tests unitaires.

J'aimerais ajouter un exemple tiré du framework 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 */);
        }

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top