web-dev-qa-db-fra.com

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?

55
user1678541

Sans spécifier public, la classe est implicitement internal. Cela signifie que la classe n'est visible qu'à l'intérieur du même assembly. Lorsque vous spécifiez public, la classe est visible en dehors de l'assembly.

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

internal class Foo {}
61
driis

Le premier équivaut à:

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

Toutes les visibilités sont par défaut les moins visibles possibles - private pour les membres de classes et structs (méthodes, propriétés, champs, classes imbriquées et enums imbriquées) et internal pour les membres directs de namespaces, car ils ne peuvent pas être privés.

internal signifie qu'un autre code du même Assembly peut le voir, mais rien d'autre (sauf assemblys amis et utilisation de la réflexion).

Cela a du sens pour deux raisons:

  1. Vous devriez de toute façon faire en sorte que les choses utilisent le moins de visibilité possible, pour renforcer votre encapsulation.
  2. S'ils étaient définis par défaut sur public, vous pourriez accidentellement rendre public quelque chose 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-la. Si vous rendez accidentellement quelque chose de trop visible, vous introduisez une faille dans votre code qui ne sera pas signalée comme une erreur et qui sera un changement de rupture à corriger plus tard.

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

22
Jon Hanna

Par défaut, tous les classes (et tous les types d'ailleurs) sont internal, donc pour qu'ils soient accessibles de l'extérieur (sans trucs comme InternalsVisibleToAttribute) vous avez pour les rendre public explicitement.

1
Anton Gogolev