785 votes

En C#, quelle est la différence entre public, private, protected et ne pas avoir de modificateur d'accès?

Toutes mes années de collège, j'ai utilisé public, et j'aimerais savoir la différence entre public, private et protected?

Aussi, que fait static par rapport à ne rien avoir?

1076voto

mbillard Points 15829

Modificateurs d'accès

De learn.microsoft.com:

public

Le type ou membre peut être accédé par n'importe quel autre code dans la même assembly ou une autre assembly qui y fait référence.

private

Le type ou membre ne peut être accédé que par le code dans la même classe ou struct.

protected

Le type ou membre ne peut être accédé que par le code dans la même classe ou struct, ou dans une classe dérivée.

private protected (ajouté en C# 7.2)

Le type ou membre ne peut être accédé que par le code dans la même classe ou struct, ou dans une classe dérivée de la même assembly, mais pas d'une autre assembly.

internal

Le type ou membre peut être accédé par n'importe quel code dans la même assembly, mais pas d'une autre assembly.

protected internal

Le type ou membre peut être accédé par n'importe quel code dans la même assembly, ou par n'importe quelle classe dérivée dans une autre assembly.

Quand aucun modificateur d'accès n'est défini, un modificateur d'accès par défaut est utilisé. Donc il y a toujours une forme de modificateur d'accès même s'il n'est pas défini.

static modificateur

Le modificateur static sur une classe signifie que la classe ne peut pas être instanciée, et que tous ses membres sont statiques. Un membre statique a une seule version peu importe combien d'instances de son type englobant sont créées.

Une classe statique est fondamentalement la même qu'une classe non statique, mais il y a une différence : une classe statique ne peut pas être instanciée de l'extérieur. En d'autres termes, vous ne pouvez pas utiliser le mot-clé new pour créer une variable du type de classe. Parce qu'il n'y a pas de variable d'instance, vous accédez aux membres d'une classe statique en utilisant le nom de la classe même.

Cependant, il y a une telle chose qu'un constructeur static. N'importe quelle classe peut en avoir un, y compris les classes statiques. Ils ne peuvent pas être appelés directement & ne peuvent pas avoir de paramètres (autre que tout paramètre de type sur la classe elle-même). Un constructeur statique est appelé automatiquement pour initialiser la classe avant que la première instance ne soit créée ou que des membres statiques ne soient référencés. Ça ressemble à ça :

static class Foo()
{
    static Foo()
    {
        Bar = "fubar";
    }

    public static string Bar { get; set; }
}

Les classes statiques sont souvent utilisées comme des services, vous pouvez les utiliser comme suit :

MyStaticClass.ServiceMethod(...);

19 votes

Et vous pouvez avoir des méthodes statiques dans des classes non statiques, n'est-ce pas?

15 votes

Oui, ils se comporteraient de la même manière que dans mon exemple.

9 votes

Que signifie le terme "assemblage" dans ce contexte?

191voto

Quandary Points 12867

Un aperçu graphique (résumé en un clin d'œil)

Visibilité

En réalité, c'est un peu plus compliqué que cela.
Maintenant (à partir de C# 7.2), il existe également private protected, et cela dépend si une classe dérivée est dans la même assembly ou non.

Donc l'aperçu doit être étendu :

Visibilité étendue

Voir aussi les docs C#-dotnet sur le sujet.

Puisque les classes statiques sont scellées, elles ne peuvent pas être héritées (sauf de Object), donc le mot-clé protected est invalide sur les classes statiques.

Pour les valeurs par défaut si vous ne mettez aucun modificateur d'accès devant, voir ici :
Visibilité par défaut pour les classes et membres C# (champs, méthodes, etc.)?

Non-nesting

enum                              public
non-nested classes / structs      internal
interfaces                        internal
délégués dans l'espace de noms    internal
membre(s) de classe/struct        private
délégués imbriqués dans classe/struct  private

Imbriqué :

enum imbriqué      public
interface imbriquée public
classe imbriquée     private
struct imbriqué    private

Aussi, il y a le mot-clé sealed, qui rend une classe non héritable.
Aussi, en VB.NET, les mots-clés sont parfois différents, donc voici une feuille de triche :

Équivalents VB vs. CS

1 votes

@n BrtiL : Es-tu sûr ? Une classe dérivée dans une assembly différente ?

0 votes

Classe dérivée dans la même assembly, nous pouvons ; différente, nous ne pouvons pas. Je pensais que vous vouliez dire comme dans la même assembly...

1 votes

@n BrtiL: Hmm, c'est vrai, cela devrait en fait être éclos.

164voto

JosephStyons Points 21187

Public - Si vous pouvez voir la classe, alors vous pouvez voir la méthode

Private - Si vous faites partie de la classe, alors vous pouvez voir la méthode, sinon non.

Protected - Comme Private, mais tous les descendants peuvent également voir la méthode.

Static (class) - Rappelez-vous la distinction entre "Classe" et "Objet" ? Oubliez tout cela. Ils sont les mêmes avec "static"... la classe est l'unique instance d'elle-même.

Static (method) - Chaque fois que vous utilisez cette méthode, elle aura un cadre de référence indépendant de l'instance réelle de la classe à laquelle elle appartient.

1 votes

Est-ce que vous ne pouvez pas avoir de méthodes statiques dans une classe non statique cependant?

1 votes

Oui, mais je parlais d'une classe statique. J'ai ajouté une entrée séparée pour décrire les méthodes statiques. Merci pour la remarque.

2 votes

'Objet' pourrait ne pas être un terme approprié ici lorsqu'on parle de C#, car le type de base pour toutes les classes est System.Object. 'Instance' serait un meilleur mot, ou 'objet' (avec un 'o' minuscule).

22voto

leppie Points 67289

En ce qui concerne la question de Rien

  • Les types de namespace sont internes par défaut
  • Tout membre de type, y compris les types imbriqués, sont privés par défaut

11voto

CraigTP Points 18514

Hmm.

Voir ici: Modificateurs d'accès.

En résumé:

Public donne à la méthode ou au type une visibilité complète depuis d'autres types/classes.

Private permet uniquement au type contenant la méthode/variable privée d'accéder à la méthode/variable privée (notez que les classes imbriquées ont également accès aux méthodes/variables privées des classes contenant).

Protected est similaire à private, sauf que les classes dérivées peuvent également accéder aux méthodes protégées.

"Nothing" est l'équivalent en VB.NET de null. Bien que si vous faites référence à "nothing" signifiant "pas de modificateur d'accès", alors cela dépend, mais une règle générale (surtout en C#) est que si vous ne spécifiez pas explicitement un modificateur d'accès, la déclaration de méthode/variable est généralement aussi restrictive qu'elle peut l'être. c'est-à-dire

public class MyClass
{
    string s = "";
}

est effectivement la même que:

public class MyClass
{
    private string s = "";
}

L'article MSDN lié offrira une description complète lorsqu'aucun modificateur d'accès n'est explicitement spécifié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X