308 votes

Pourquoi utiliser une méthode publique dans une classe interne?

Il y a beaucoup de code dans l'un de nos projets qui ressemble à ceci:

internal static class Extensions
{
    public static string AddFoo(this string s)
    {
        if (!string.IsNullOrEmpty(s)) return s + "Foo";
        return "Foo";
    }
}

Est-il explicite la raison pour ce faire d'autre que "il est plus facile de faire le type de public, plus tard?"

Je soupçonne il importe seulement de manière très étrange cas de bord (réflexion en Silverlight) ou pas du tout.

501voto

Eric Lippert Points 300275

Mise à JOUR: Cette question a été l'objet de mon blog en septembre 2014. Merci pour la grande question!

Il y a un grand débat sur cette question au sein de l'équipe du compilateur lui-même.

Tout d'abord, il est sage de comprendre les règles. Un membre du public d'une classe ou structure est un membre qui est accessible à tout ce qui peut accéder au type contenant. Si un membre du public d'une classe interne est effectivement internes.

Alors maintenant, étant donné une classe interne, doit ses membres que vous souhaitez accéder à l'assemblée d'être marqué comme public ou interne?

Mon avis est: marque tels les membres du public.

J'utilise "public" pour dire "ce membre n'est pas un détail d'implémentation". Un membre protégé est un détail d'implémentation; il y a quelque chose qui va être nécessaire de faire une classe dérivée de travail. Un membre interne est un détail d'implémentation; quelque chose d'autre interne à cette assemblée besoins des membres afin de fonctionner correctement. Un membre du public dit "ce membre représente la clé, documenté fonctionnalités fournies par cet objet."

Fondamentalement, mon attitude est: supposons que j'ai décidé de faire cette classe interne dans une classe publique. Pour ce faire, je veux changer exactement une chose: l'accessibilité de la classe. Si l'activation interne d'une classe dans une classe publique signifie que j'ai aussi tourner un membre interne à un membre du public, alors que le membre a été de la partie publique de la surface de la classe, et il doit avoir été public en premier lieu.

D'autres personnes sont en désaccord. Il y a un contingent qui dit qu'ils veulent être en mesure de jeter un oeil à la déclaration d'un membre et immédiatement savoir si elle va être appelée uniquement à partir de code interne.

Malheureusement, cela ne fonctionne pas toujours très bien; par exemple, une classe interne qui implémente une interface interne a encore d'avoir la mise en œuvre des membres marqués en tant que public, car ils sont une partie de la surface publique de la classe.

22voto

Guvante Points 10338

Si la classe est - internal, il n'a pas d'importance d'un point de vue de l'accessibilité si vous marquez une méthode internal ou public. Cependant, il est toujours bon d'utiliser le type que vous pourriez utiliser si la classe ont été public.

Alors que certains ont dit que cela facilite les transitions de l' internal de public. Il sert également partie de la description de la méthode. Internal méthodes sont généralement considérés comme dangereux pour le libre accès, en public méthodes sont considérées comme (surtout) de jeu gratuit.

En utilisant internal ou public comme vous le feriez dans un public classe, vous assurer que vous communiquez ce que le style de l'accès est prévu, tout en facilitant le travail nécessaire pour faire la classe public dans le futur.

11voto

Oded Points 271275

Je soupçonne que "il est plus facile de faire le type de public, plus tard?" est-il.

Les règles de portée veux dire que la méthode ne sera visible qu' internal - de sorte qu'il n'a pas vraiment d'importance si les méthodes sont marquées public ou internal.

Une possibilité qui vient à l'esprit est que la classe est public et a été plus tard changé d' internal et le développeur n'a pas pris la peine de changer toute la méthode de l'accessibilité des modificateurs.

11voto

Ɖiamond ǤeezeƦ Points 1254

J'ai souvent la marque de mes méthodes dans les classes internes public à la place de l'interne en tant que a) il n'a pas vraiment d'importance et b) j'utilise interne pour indiquer que la méthode est interne sur le but (il y a une raison pourquoi je ne veux pas exposer cette méthode dans une classe publique. Donc, si j'ai une méthode interne-je vraiment besoin de comprendre la raison pour laquelle il est interne avant de le changer pour le public, alors que, si j'ai affaire à un public de méthode dans une classe interne, j'ai vraiment de réfléchir à pourquoi la classe est interne, par opposition à la raison pour laquelle chaque méthode est interne.

8voto

Trevor Pilley Points 7304

Dans certains cas, il peut être aussi que le type interne implémente une interface publique qui signifie que toutes les méthodes définies dans l'interface auraient encore besoin d'être déclarée public.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X