web-dev-qa-db-fra.com

méthodes publiques vs méthodes internes sur une classe interne

internal class Foo
{
  public void Fee()
  {
    Debug.WriteLine("Fee");
  }

  internal void Fi()
  {
    Debug.WriteLine("Fi");
  }
}

Je pense que Fee () et Fi () sont également accessibles car toute la classe est déjà interne. Suis-je en train d'oublier quelque chose? Y a-t-il une raison de choisir public ou interne pour les méthodes dans un cas comme celui-ci?

81
ScottS

La déclaration internal class Foo Remplacera l'accessibilité de la méthode public void Fee(), la rendant ainsi interne.

Dans ce cas, l'utilisation interne contre public sur les méthodes aura le même effet. La seule raison pour laquelle je choisirais les méthodes publiques par rapport aux méthodes internes dans un cas comme celui-ci serait de faciliter la transition vers une classe publique dans une future version, si vous choisissez de le faire.

95
Reed Copsey

La seule chose qui manque ici dans la réponse est pourquoi feriez-vous cela?

Certaines bibliothèques ont beaucoup de classes qui ne sont pas destinées au consommateur de la bibliothèque mais elles doivent hériter des interfaces marquées comme publiques. Par exemple, j'ai une bibliothèque avec une classe qui hérite de l'interface IComparer mais elle n'est utilisée qu'en interne et je ne veux pas encombrer l'aspect public de ma bibliothèque. Si je marque la fonction de comparaison implémentée comme interne, le compilateur se plaint que je n'implémente pas l'interface IComparer.

Alors, comment puis-je implémenter l'interface avec succès et en même temps l'empêcher d'être accessible dans l'aspect public de ma bibliothèque? Marquez la classe comme interne mais la fonction implémentée comme publique.

35
Mike Cheel

En fait - il y a une grande différence si vous utilisez la réflexion; en particulier, Silverlight peut être très contrarié si vous essayez d'accéder aux méthodes internes par réflexion, même si vous y auriez eu accès. J'ai vu des occasions où j'ai dû rendre publique une méthode pour faire fonctionner le code sur Silverlight, même si cela fonctionne sur .NET normal.

Vous pourriez trouver la même chose avec une confiance partielle dans .NET normal.

28
Marc Gravell

Cela ferait une différence lorsque vous souhaitez que votre classe interne implémente une interface. La méthode, qui est une implémentation d'une interface, devrait être publique.

8
user1343819

Vous avez raison, les frais et le Fi seront également accessibles.

De la spécification du langage CSharp 3.0, sous 3.5.2:

Le domaine d'accessibilité d'un membre imbriqué M déclaré dans un type T dans un programme P est défini comme suit (en notant que M lui-même peut éventuellement être un type):

• Si l'accessibilité déclarée de M est publique, le domaine d'accessibilité de M est le domaine d'accessibilité de T.

Ainsi, même si Fee est déclaré public, il sera tout aussi accessible que Foo (c'est-à-dire interne).

7
eglasius

Selon la documentation msdn votre classe Foo ne sera pas accessible en dehors de votre Assembly, donc cela ne fait aucune différence de marquer les méthodes comme internes ou publiques; cela ne fait même pas de différence en utilisant l'attribut InternalsVisibleTo

Je n'irais qu'avec des méthodes internes si une classe est interne. si vous changez d'avis et rendez la classe publique, vous pouvez simplement remplacer un texte et vous avez terminé.

1
gnikolaropoulos