Classe vs classe publique

Quelle est la différence entre:

namespace Library{ class File{ //code inside it } } 

et:

 namespace Library{ public class File{ //code inside it } } 

Alors, quelle sera la différence entre classe publique et classe ?

Sans spécifier public la classe est implicitement internal . Cela signifie que la classe est uniquement visible dans le même assembly. Lorsque vous spécifiez public , la classe est visible à l’extérieur de l’assembly.

Il est également permis de spécifier explicitement le modificateur internal :

 internal class Foo {} 

Le premier est équivalent à:

 namespace Library{ internal class File{ //code inside it } } 

Toutes les visibilités par défaut sont les moins visibles possibles – private pour les membres des class es et struct s (méthodes, propriétés, champs, classes nestedes et enum s nesteds) et internal pour les membres directs des namespace de namespace s

internal signifie qu’un autre code dans le même assemblage peut le voir, mais rien d’autre (sauf les assemblées d’amis et l’utilisation de la reflection).

Cela a du sens pour deux raisons:

  1. Vous devriez consciemment faire en sorte que les choses utilisent le moins de visibilité possible pour renforcer votre encapsulation.
  2. S’ils étaient en défaut de rendre public vous pourriez accidentellement créer quelque chose de public qui devrait être privé ou interne. Si vous faites accidentellement quelque chose de pas assez visible, vous obtenez une erreur de compilation évidente et corrigez le problème. Si vous faites accidentellement quelque chose de trop visible, vous introduisez une faille dans votre code qui ne sera pas signalée comme une erreur et qui constituera un changement à corriger ultérieurement.

Il est souvent considéré comme meilleur style d’être explicite avec vos modificateurs d’access, pour être plus clair dans le code, juste ce qui se passe.

Par défaut, toutes les class es (et tous les types en l’occurrence) sont internal , donc pour qu’elles soient accessibles de l’extérieur (sans matériel comme InternalsVisibleToAtsortingbute ), vous devez les rendre public explicitement.