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 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 {}
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 class
es et struct
s (méthodes, propriétés, champs, classes imbriquées et enum
s imbriquées) et internal
pour les membres directs de namespace
s, 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:
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.
Par défaut, tous les class
es (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.