web-dev-qa-db-fra.com

Modificateur d'accès C # pour exposer la classe uniquement dans l'espace de noms

Dans Java vous disposez d'une protection au niveau du package qui garantit que les classes ne sont utilisables que dans le package.

Les espaces de noms en C # agissent plus ou moins comme des packages. Mais C # n'a pas de niveau de protection pour protéger les classes dans un espace de noms.

Y a-t-il une raison spécifique à cela?

40
Jaco

Il n'y a pas un tel modificateur d'accès: le modificateur le plus proche est internal, mais l'unité de protection est l'assembly dans lequel réside la classe, pas son espace de noms.

On pourrait soutenir qu'il est possible d'atteindre un niveau de contrôle similaire en utilisant internal, car les deux types de restrictions empêchent les étrangers d'accéder aux détails d'implémentation de votre bibliothèque. La seule personne à qui cela fait une différence est vous, l'écrivain de la bibliothèque, et vous avez le contrôle total de ce qu'il faut exposer et de ce qu'il faut cacher de toute façon. Essentiellement, cela signifie que si vous ne souhaitez pas utiliser une classe en dehors de son espace de noms, abstenez-vous simplement de l'utiliser; si la classe est internal, personne d'autre ne pourra non plus utiliser cette classe.

20
dasblinkenlight

Dans .NET, il existe des assemblys (fichiers dll ou exe), vous pouvez utiliser le modificateur internal pour limiter l'accès uniquement au sein du même assembly

3
Alexandr Mihalciuc

Y a-t-il une raison spécifique à cela?

C'est principalement parce qu'il y a des clés différences entre les packages et les espaces de noms

Pour simplifier ce qui a déjà été dit dans la question liée et ici: les espaces de noms en C # sont principalement destinés à aider à organiser le contenu d'un assembly, à la fois en interne et en externe. Java ont plus en commun avec les assemblys C #, et il existe un modificateur d'accès en C # qui se limite au niveau Assembly: internal .

1
User