2010-12-14 25 views
2
namespace hi 
{ 
    class hithere 
    { 
     public int numberOne = 12; 
     private int numberTwo = 12; 

     static void yo() 
     { 
     } 
    } 
} 

Quelqu'un peut-il me dire la différence entre les variables numberOne et numberTwo dans cet extrait de code?Différence entre les variables publiques et privées

+0

Oh et comment puis-je changer mon nom de cet utilisateur ######### stuff? – DarkLightA

+2

Modifier votre profil –

+0

Thanks mate.Non utilisé pour avoir un nom d'utilisateur comme ça :) – DarkLightA

Répondre

1

Variables publiques sont accessibles à partir des classes côté dehors mais une privée juste accessible pour la classe actuelle et les classes internes:

public class VarClass 
{ 
    public int publicID = 10; 
    private int privateID = 100; 
    public VarClass() 
    { 
     Console.WriteLine(publicID); 
     Console.WriteLine(privateID); 
    } 

    public class InnerClass 
    { 
     public InnerClass() 
     { 
      VarClass c = new VarClass(); 
      Console.WriteLine(c.privateID); 
      Console.WriteLine(c.publicID); 
     } 
    } 
} 

public class OuterClass 
{ 
    public OuterClass() 
    { 
     VarClass c = new VarClass(); 
     Console.WriteLine(c.privateID); // Compile Error 
     Console.WriteLine(c.publicID); 
    } 
} 
2

D'autres objets peuvent accéder à NumberOne, mais ils ne peuvent pas accéder à numberTwo.

Je peux faire Your_Object.numberOne = 14; mais je ne peux pas faire Your_Object.numberTwo= 14;

Maintenant, je pourrais être en mesure d'accéder à la numberTwo par la réflexion en fonction des autorisations définies dans l'application, mais je ne peux pas directement.

Variables in C#
Reflection in C#
Accessors in C#

0

en général, PUBLIC signifie tout autre code en dehors de la classe peut changer sa valeur. PRIVATE ne peuvent être utilisés/modifiés que dans la classe elle-même. En outre, si vous créez des classes dérivées d'un autre et que vous souhaitez que la classe de niveau enfant puisse utiliser/modifier les valeurs de son parent, mais pas d'autres codes génériques en dehors de la classe, utilisez PROTECTED.

5

De l'accessibility levels à MSDN:

publique L'accès ne se limite pas.

protected L'accès est limité à la classe ou aux types dérivés de la classe qui la contient.

interne L'accès est limité à l'assemblage actuel.

interne protégé accès est limité à l'assemblage en cours ou types dérivés de la classe contenant .

privé L'accès est limité au type conteneur.

0

public et private sont des modificateurs d'accès pour les membres. Cela fait référence à qui peut accéder aux membres directement via le code. public signifie que l'accès n'est pas limité, de sorte que tout le monde peut accéder au membre directement via le code. private signifie que l'accès est limité uniquement à la classe conteneur. Ainsi, tout le monde peut accéder directement au code numberOne, mais seule la classe conteneur peut accéder directement au code numberTwo.

Il y a un total de cinq modificateurs d'accès:

public: l'accès ne se limite pas

protected: l'accès est limité à la classe contenant ou classes dérivées de la classe contenant

internal: accès est limité à l'ensemble contenant

protected internal: ceci est un OU de protected et internal de sorte que l'accès est limité à la classe contenant ou classes dérivées de la classe contenant ou de l'ensemble contenant

private: l'accès est limité à la classe contenant

Notez que la clause « directement par le code » est critique ici ; il est possible d'accéder à ces membres en utilisant la réflexion.

La section pertinente de la spécification C# est §3.5, en particulier le §3.5.2.

+0

'private: l'accès est limité à la classe de définition' No, Also Inner class –

+0

@Saeed: Cela fait partie de la classe de définition. – jason

+0

Il est préférable de dire 'type contenant 'comme MSDN, car ce n'est pas un définisseur de variable. –

0

Rechercher "Encapsulation". Il y a tellement de matériaux faciles à étudier.

1

Dans les termes les plus simples numberOne être marqué comme public signifie que si vous créez une instance de votre classe hithere cette variable membre sera accessible. Par exemple:

hithere h = new hithere() 
h.numberOne = 42; 

numberTwo étant des moyens privés que ce n'est pas accessible et ne peut être utilisé dans la classe hithere. Donc prendre l'exemple ci-dessus plus loin:

hithere h = new hithere() 
h.numberOne = 42; 
h.numberTwo = 84; 

La dernière ligne provoquerait une erreur de compilation car vous ne pouvez pas accéder à numberTwo car cela est privé.

Il est probablement utile de passer un peu de temps à lire sur les modificateurs d'accès, un rapide Google trouvera de nombreux exemples, par exemple:

http://www.devsource.com/c/a/Techniques/Understanding-C-Class-and-Member-Modifiers/ http://msdn.microsoft.com/en-us/library/ba0a1yw2 % 28v = vs.80% 29.aspx

De plus, votre classe hithere n'a pas de modificateur d'accès défini, par conséquent le compilateur suppose que cela est privé. En tant que tel, si vous deviez référencer votre bibliothèque depuis un autre, vous ne seriez pas capable de créer des instances de la classe hithere.

0

Cela signifie que si vous avez une autre classe comme ceci:

namespace hi 
{ 
    class hithere2 
    { 
     static void yo2() 
     { 
      hithere h = new hithere(); 
      h.numberOne = 2; 
      h.numberTwo = 3; 
     } 
    } 
} 

Le deuxième erreurs, mais le premier est OK.