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?
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?
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.
Le type ou membre ne peut être accédé que par le code dans la même classe ou struct.
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.
Le type ou membre peut être accédé par n'importe quel code dans la même assembly, mais pas d'une autre assembly.
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
modificateurLe 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(...);
Un aperçu graphique (résumé en un clin d'œil)
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 :
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 :
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...
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.
Est-ce que vous ne pouvez pas avoir de méthodes statiques dans une classe non statique cependant?
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.
'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).
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 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.