interne vs public en c #

92

Je souhaite connaître la différence entre les modificateurs de visibilité publicet internal.

Quand devrions-nous utiliser internalsur une classe et quand public? Je ne sais pas quand une méthode devrait être publicou internal.

J'ai lu que cela internalpeut être consulté via l'Assemblée, tout en publicpouvant également être utilisé via l'Assemblée où réside la différence.

NoviceToDotNet
la source

Réponses:

101

public est visible de partout.

internal n'est visible que dans un assemblage

Vous avez tendance à utiliser uniquement interne pour protéger les API internes. Par exemple, vous pouvez exposer plusieurs surcharges d'une méthode:

public int Add(int x, int y)
public int Add(int x,int y, int z)

Les deux appellent la méthode interne

internal int Add(int[] numbers)

Vous pouvez alors mettre beaucoup de sophistication sur une méthode, mais la «protéger» en utilisant des méthodes de façade qui peuvent aider le programmeur à appeler la méthode correctement. (La méthode d'implémentation avec le paramètre array peut avoir une limite arbitraire de valeurs, par exemple.)

Il convient également de noter qu'en utilisant Reflection, toutes les méthodes sont appelables quelle que soit leur visibilité. Un autre «hack» pour contrôler / accéder aux API cachées en interne.

Programme.X
la source
5
dans une classe interne puis-je déclarer les méthodes publiques ..?
NoviceToDotNet
Non, car cela provoquerait un conflit. Le compilateur vous en informera et ne parviendra pas à compiler.
Program.X
14
@ Program.X: En fait, vous pouvez et le compilateur ne vous dit rien.
OR Mapper
En fait, je suis venu ici en recherchant sur Google s'il s'agit ou non d'une fonctionnalité. Imaginez faire la classe internalet toutes les méthodes public. Si vous avez besoin d'une meilleure visibilité, vous pouvez redéfinir l'ensemble de la classe public. Mais je ne sais pas si elle est censée être utilisée de cette façon. Alors je continue à googler ... edit Et voilà, même sujet: stackoverflow.com/questions/9302236
...
31

internalest utile lorsque vous souhaitez déclarer un membre ou un type dans une DLL, pas en dehors de cela ...
normalement, lorsque vous déclarez un membre car Publicvous pouvez y accéder à partir d'autres DLL. mais, si vous deviez déclarer quelque chose comme public juste dans votre bibliothèque de classes, vous pouvez le déclarer comme Internal.
en définition formelle: les membres internes sont visibles juste à l'intérieur de l'assemblage courant ...

Dr TJ
la source
11

internalest également utile lors de l'écriture de tests unitaires. L' InternalsVisibleToattribut permet à votre assembly de test d'accéder aux méthodes internes de votre assembly de code. C'est-à-dire que vous pouvez tester des méthodes qui semblent privées au monde extérieur sans utiliser la réflexion.

Brian Rasmussen
la source
6

Public est également accessible en dehors de l'assembly. Ainsi, lorsque vous avez une classe qui ne devrait pas être accédée, chaque classe de l'assembly devrait pouvoir y accéder, alors interne est la bonne chose. Si vous avez besoin d'un accès extérieur, utilisez public.

Tomas Jansson
la source
4

En outre, les propriétés marquées comme lèveront internalun BindingExpression path errorsi elles sont utilisées pour DataBinding dans WPF. Donc, ceux-ci doivent être publicpour fonctionner correctement, même lorsque le DataBinding a lieu dans le même assembly.

M463
la source
-3

Si vous pouvez référencer l'assemblage de l'extérieur, vous avez la portée des classes internes et publiques

Leroy.P
la source