web-dev-qa-db-fra.com

Comment accéder aux variables privées en utilisant {get; ensemble; }

Je voudrais créer une classe pour mon site Web avec beaucoup de variable privée.

Je pensais qu'il y avait une solution pour ne pas écrire tous les getters et les setters pour chaque variable, quelque chose comme

private int confirmed { get; set; }

Est-ce la bonne façon? Et ensuite, comment puis-je accéder à cette valeur de l’extérieur de la classe?

J'ai essayé .confirmed, j'ai l'erreur de dire que c'est privé (ce que je comprends)

Mais plus surprenant, .getConfirmed() ou getconfirmed() ne fonctionne pas non plus.

Je pensais que le { get; set; } créerait implicitement ces méthodes.

Quelqu'un peut-il clarifier cette préoccupation pour moi s'il vous plaît?

11
Krowar

Vous pouvez déclarer votre propriété comme publique, puis marquer le getter ou le setter individuellement comme privé:

public int confirmed { get; private set; }

De cette façon, vous pouvez accéder à confirmed en dehors de votre classe définie:

Console.WriteLine(myClass.confirmed); // This is OK
myClass.confirmed = "Nothing"; // Can't do this

Et le seul qui puisse définir la valeur de confirmed est alors MyClass:

public class MyClass {
    public int confirmed { get; private set; }

    public MyClass() {
        this.confirmed = "This"; // This is fine as we have private access
    }
}
16
CodingIntrigue

Vous devez comprendre cela,

private int confirmed { get; set; }

sera étendu à un ensemble de méthodes private avec un champ de sauvegarde private,

private int _confirmed;

private int confirmed_get() 
{ 
    return this._confirmed; 
}

private void confirmed_set(int value) 
{ 
    this._confirmed = value; 
}

Ainsi, en marquant la propriété private, l'accesseur et le mutateur sont également privés, raison pour laquelle vous ne pouvez pas y accéder en dehors de la classe. De plus, ces méthodes ne sont pas accessibles au moment de la compilation. L'appel de instance.confirmed_get() n'est donc pas autorisé. Seul instance.confimed permet de lire et d'écrire dans la propriété.

Ce que vous voudrez peut-être, c'est de le déclarer public,

public int confirmed { get; set; }

où le comportement est similaire (le champ est toujours private), mais les deux méthodes sont maintenant public. Comme d'autres l'ont mentionné, vous pouvez modifier individuellement les types de comportement get et set pour readonly ou writeonly,

public int confirmed { get; private/protected set; }

ou

public int confirmed { private/protected get; set; }

Et une dernière chose, vous devriez prendre l’habitude d’utiliser des étuis de chameaux, par exemple. Confirmed et cas inférieur de chameau pour les champs, par ex. confirmed (certains pourraient même faire _confirmed). Il est courant que les conventions de dénomination distinguent les deux types, en particulier pour les consommateurs de la classe.

4
rae1

comment accéder à cette valeur en dehors de la classe?

Vous ne pouvez pas (sans code de confiance sous forme de réflexion). Ils sont privés . Si vous voulez que le getter soit public alors que le setter private alors

public int confirmed { get; private set; }

Je pensais que {get; set;} créerait implicitement ces méthodes.

C'est le cas, mais ils ne sont pas accessibles au moment de la conception.

3
D Stanley

Faites ceci si vous voulez que ça vienne de l’extérieur de la classe.

    public int confirmed { get; set; }

ou vous pouvez aller dans cette voie:

    private int confirmed;

    public int Confirmed 
    {
        get { return confirmed }
        set { confirmed = value; }
    }
2
DROP TABLE users

Il y a plusieurs façons d'effectuer une telle action. Selon vos besoins, vous pouvez choisir l'une des méthodes ci-dessous:

    // Old Conventional - Statement body
    public class SampleClass1
    {
        public bool CanAccessFromOutside
        {
            get { return _cannotAccessFromOutside; }
        }

        private bool _cannotAccessFromOutside;

        private void DoSomething()
        {
            _cannotAccessFromOutside = true;
        }
    }


    // Expression Bodied Property
    public class SampleClass2
    {
        public bool CanAccessFromOutside => _cannotAccessFromOutside;

        private bool _cannotAccessFromOutside;

        private void DoSomething()
        {
            _cannotAccessFromOutside = true;
        }
    }

    // Auto Property
    public class SampleClass3
    {
        public bool CanAccessFromOutside { get; private set; }

        private void DoSomething()
        {
            CanAccessedFromOutside = true;
        }
    }
1
singhsac