Quelle est la différence entre public, privé, protégé et n'ayant pas de modificateur d'accès?


Toutes mes années de collège, j'ai été à l'aide de public, et voudrais savoir la différence entre public, private, et protected?

Aussi, que fait static par opposition à n'avoir rien?

Author: Liam, 2009-03-05

14 answers

Modificateurs d'Accès

Public

Le type ou le membre est accessible par tout autre code du même assembly ou d'un autre assembly qui le fait référence.

Privé

Le type ou le membre n'est accessible que par du code dans la même classe ou structure.

Protégé

Le type ou le membre n'est accessible que par code dans la même classe ou structure, ou dans un la classe dérivée.

Privé protégé (ajouté dans C# 7.2)

Le type ou le membre n'est accessible que par du code dans la même classe ou structure, ou dans une classe dérivée du même assembly, mais pas d'un autre assembly.

Internes

Le type ou le membre est accessible par n'importe quel code dans le même assembly, mais pas à partir d'un autre assembly.

Interne protégé

Le type ou le membre est accessible par n'importe quel code dans le même assembly, ou par n'importe quelle classe dérivée dans un autre assembly.

Lorsque pas de modificateur d'accès est définie, un modificateur d'accès par défaut est utilisé. Il y a donc toujours une forme de modificateur d'accès même s'il n'est pas défini.

Statique

Le modificateur statique 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 version quel que soit le nombre d'instances de son type englobant 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 en externe. En d'autres termes, vous ne pouvez pas utiliser le nouveau mot clé pour créer une variable du type de classe. Comme il n'y a pas de variable d'instance, vous accédez aux membres d'une classe statique en utilisant le nom de classe lui-même.

Cependant, il existe une chose telle qu'un statique constructeur. N'importe quelle classe peut en avoir une, y compris les classes statiques. Ils ne peuvent pas être appelés directement et ne peuvent pas avoir de paramètres (autres que les paramètres 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 tous les membres statiques soient référencés. Ressemble à ceci:

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

    public static string Bar { get; set; }
}

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

MyStaticClass.ServiceMethod(...);
 895
Author: mbillard, 2018-09-04 08:36:38

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

Private - Si vous êtes une partie de la classe, alors vous pouvez voir la méthode, pas autrement.

Protected - Identique à Private, plus tous les descendants peuvent également voir la méthode.

Statique (classe) - n'oubliez pas la distinction entre "Classe" et "Objet" ? Oubliez tout ça. Ils sont les mêmes avec "statique"... la classe est la seule et unique instance de lui-même.

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

 144
Author: JosephStyons, 2009-03-05 17:22:22

Un aperçu graphique (résumé en un mot)

Visibilité

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

Non imbriqué

enum                              public
non-nested classes / structs      internal
interfaces                        internal
delegates in namespace            internal
class/struct member(s)            private
delegates nested in class/struct  private

Imbriqué:

nested enum      public
nested interface public
nested class     private
nested struct    private
 131
Author: Stefan Steiger, 2017-05-23 10:31:39

Concernant la question de Rien

  • Les types d'espaces de noms sont internes par défaut
  • Tout membre de type, y compris les types imbriqués, est privé par défaut
 22
Author: leppie, 2009-03-05 17:27:55

entrez la description de l'image ici

using System;

namespace ClassLibrary1
{
    public class SameAssemblyBaseClass
    {
        public string publicVariable = "public";
        protected string protectedVariable = "protected";
        protected internal string protected_InternalVariable = "protected internal";
        internal string internalVariable = "internal";
        private string privateVariable = "private";
        public void test()
        {
            // OK
            Console.WriteLine(privateVariable);

            // OK
            Console.WriteLine(publicVariable);

            // OK
            Console.WriteLine(protectedVariable);

            // OK
            Console.WriteLine(internalVariable);

            // OK
            Console.WriteLine(protected_InternalVariable);
        }
    }

    public class SameAssemblyDerivedClass : SameAssemblyBaseClass
    {
        public void test()
        {
            SameAssemblyDerivedClass p = new SameAssemblyDerivedClass();

            // NOT OK
            // Console.WriteLine(privateVariable);

            // OK
            Console.WriteLine(p.publicVariable);

            // OK
            Console.WriteLine(p.protectedVariable);

            // OK
            Console.WriteLine(p.internalVariable);

            // OK
            Console.WriteLine(p.protected_InternalVariable);
        }
    }

    public class SameAssemblyDifferentClass
    {
        public SameAssemblyDifferentClass()
        {
            SameAssemblyBaseClass p = new SameAssemblyBaseClass();

            // OK
            Console.WriteLine(p.publicVariable);

            // OK
            Console.WriteLine(p.internalVariable);

            // NOT OK
            // Console.WriteLine(privateVariable);

            // Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
            //Console.WriteLine(p.protectedVariable);

            // OK
            Console.WriteLine(p.protected_InternalVariable);
        }
    }
}

 using System;
        using ClassLibrary1;
        namespace ConsoleApplication4

{
    class DifferentAssemblyClass
    {
        public DifferentAssemblyClass()
        {
            SameAssemblyBaseClass p = new SameAssemblyBaseClass();

            // NOT OK
            // Console.WriteLine(p.privateVariable);

            // NOT OK
            // Console.WriteLine(p.internalVariable);

            // OK
            Console.WriteLine(p.publicVariable);

            // Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
            // Console.WriteLine(p.protectedVariable);

            // Error : 'ClassLibrary1.SameAssemblyBaseClass.protected_InternalVariable' is inaccessible due to its protection level
            // Console.WriteLine(p.protected_InternalVariable);
        }
    }

    class DifferentAssemblyDerivedClass : SameAssemblyBaseClass
    {
        static void Main(string[] args)
        {
            DifferentAssemblyDerivedClass p = new DifferentAssemblyDerivedClass();

            // NOT OK
            // Console.WriteLine(p.privateVariable);

            // NOT OK
            //Console.WriteLine(p.internalVariable);

            // OK
            Console.WriteLine(p.publicVariable);

            // OK
            Console.WriteLine(p.protectedVariable);

            // OK
            Console.WriteLine(p.protected_InternalVariable);

            SameAssemblyDerivedClass dd = new SameAssemblyDerivedClass();
            dd.test();
        }
    }
}
 17
Author: Narottam Goyal, 2015-05-24 07:24:49

Hmm.

Voir ici: Modificateurs d'Accès.

En un mot:

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

Private autorise uniquement le type contenant la méthode/variable privée à 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 à protected méthode.

"Rien" est VB.NET équivalent à null. Bien que si vous faites référence à " rien "signifiant" pas de modificateur d'accès", cela dépend, bien qu'une règle empirique très approximative (certainement en C#) soit que si vous ne spécifiez pas explicitement un modificateur d'accès, la déclaration de méthode/variable est généralement restricted comme il peut l'être. c'est à dire

public class MyClass
{
    string s = "";
}

Est effectivement le même que:

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

L'article MSDN lié offrira une description complète lorsqu'il n'y a pas d'accès modificateur explicitement spécifié.

 11
Author: CraigTP, 2016-01-24 22:41:39

Public - peut être accessible par n'importe qui n'importe où.
private - n'est accessible qu'à partir de with dans la classe dont il fait partie.
protected - n'est accessible qu'à partir de with dans la classe ou de tout objet qui hérite de la classe.

Rien n'est comme null mais dans VB.
Statique signifie que vous avez une instance de cet objet, la méthode pour chaque instance de cette classe.

 8
Author: Tony, 2015-09-17 13:20:46

Republier les diagrammes impressionnants de cette réponse.

Voici tous les modificateurs d'accès dans les diagrammes de Venn, de plus limitant à plus promiscuous:

private:
entrez la description de l'image ici

private protected: - ajouté dans C# 7.2
entrez la description de l'image ici

internal:
entrez la description de l'image ici

protected:
entrez la description de l'image ici

protected internal:
entrez la description de l'image ici

public:
entrez la description de l'image ici

 7
Author: Paul, 2018-07-03 08:25:40

Mmm...

Static signifie que vous pouvez accéder à cette fonction sans avoir d'instance de la classe.

Vous pouvez accéder directement à partir de la définition de classe.

 4
Author: gbianchi, 2009-03-05 13:53:14

Un statut Privé indique que les variables ne sont accessibles que par des objets de la même classe. Le statut protégé étend cet accès pour inclure également les descendants de la classe.

"dans le tableau ci-dessus, nous pouvons voir la déférence entre privé et protégé... je pense que les deux sont les mêmes.... alors, quelle est la nécessité de cette commande séparée "

Vérifiez lien MSDN pour plus d'informations

 4
Author: Grant Hood, 2012-01-07 17:57:32

Ces modificateurs d'accès spécifient où vos membres sont visibles. Vous devriez probablement lire ceci. Prenez le lien donné par IainMH comme point de départ.

Les membres statiques sont un par classe et non un par instance.

 3
Author: jpfollenius, 2009-03-05 13:52:47

Surveillez attentivement votre accessibilité de vos cours. Les classes et méthodes publiques et protégées sont par défaut accessibles à tous.

De plus, Microsoft n'est pas très explicite dans l'affichage des modificateurs d'accès (public, protégé, etc.. mots-clés) lorsque de nouvelles classes dans Visual Studio sont créées. Alors, prenez bien soin et pensez à votre accessibilité de votre classe car c'est la porte à vos internes d'implémentation.

 3
Author: Patrick Peters, 2009-03-05 14:21:00

Je pense que c'est lié à une bonne conception de POO. Si vous êtes un développeur d'une bibliothèque que vous souhaitez masquer le fonctionnement interne de votre bibliothèque. De cette façon, vous pouvez modifier le fonctionnement interne de votre bibliothèque plus tard. Vous mettez donc vos membres et vos méthodes d'assistance comme privés, et seules les méthodes d'interface sont publiques. Les méthodes qui doivent être écrasées doivent être protégées.

 2
Author: Darius Kucinskas, 2013-08-28 19:53:25

C# a au total 6 modificateurs d'accès:

Private: Le membre déclaré avec cette accessibilité peut être visible dans le type containing, il n'est visible par aucun type dérivé, d'autres types dans le même assembly ou des types en dehors de l'assembly containing. c'est-à-dire que l'accès est limité au type contenant uniquement.

Protected : Le membre déclaré avec cette accessibilité peut être visible dans les types dérivés du type contenant dans le ensemble contenant, et les types dérivés du type contenant en dehors de l'ensemble contenant. c'est à dire, l'accès est limité aux types dérivés du type contenant.

Internal: Le membre déclaré avec cette accessibilité peut être visible dans l'assemblage contenant ce membre, il n'est visible par aucun assemblage en dehors de l'assemblage contenant. c'est à dire, l'accès est limité contenant de l'assemblée.

Interne protégé : Le membre déclaré avec ce l'accessibilité peut être visible dans les types dérivés du type contenant à l'intérieur ou à l'extérieur de l'assemblage contenant, elle est également visible pour tous les types de l'assemblage contenant. c'est-à-dire que l'accès est limité à contenir des assemblys ou des types dérivés.

Public: Le membre déclaré avec cette accessibilité peut être visible dans l'assemblée contenant ce membre, ou toute autre assemblée faisant référence à l'assemblée contenant. c'est à dire, l'accès n'est pas limité.

C# 7.2 est l'ajout d'un nouveau niveau d'accessibilité:

Private protected: Le membre déclaré avec cette accessibilité peut être visible dans les types dérivés de ce type contenant dans l'assembly contenant. Il n'est visible par aucun type non dérivé du type contenant ou en dehors de l'assemblage contenant. c'est-à-dire que l'accès est limité aux types dérivés dans l'assemblage contenant.

Source incluant un exemple de code du nouvel accès privé protégé modificateur

 1
Author: Baccata, 2017-12-20 09:27:01