web-dev-qa-db-fra.com

public getter et private setter de même nom sont-ils possibles en c #?

Comment puis-je faire un getter public et un passeur privé pour une propriété? Le texte suivant est-il correct?

public String Password
{
    set { this._password = value; }
}

private String Password
{
    get { return this._password; }
}
31
BlueBird

Oui, c'est possible, même avec les propriétés automatiques. J'utilise souvent:

public int MyProperty { get; private set; }
78
Anders Abel

Oui, à partir de C # 2.0, vous pouvez spécifier différents niveaux d'accès pour le getter et le créateur d'une propriété.

Mais vous avez une syntaxe erronée: vous devez les déclarer comme faisant partie de la même propriété. Marquez simplement celui que vous voulez restreindre avec private. Par exemple:

public String Password
{
    private get { return this._password; }
    set { this._password = value; }
}
11
Cody Gray
public String Password
{
    private set { this._password = value; }
    get { return this._password; }
}

ou vous pouvez utiliser une propriété implémentée automatiquement:

public String Password { get; private set; }
3
Jason Moore
public String Password
{
    private set { this._password = value; }
    get { return this._password; }
}

MSDN:

Les méthodes get et set ne sont généralement Pas différentes des autres méthodes. Ils Peuvent exécuter n'importe quelle logique de programme, émettre des exceptions , Être ignorés et être déclarés Avec tous les modificateurs autorisés par Le langage de programmation.

Edit: La citation MSDN explique simplement pourquoi geter et setter peuvent avoir différents accès aux médias, bon point soulevé par @Cody Grey:

Oui, les propriétés peuvent exécuter la logique du programme Et émettre des exceptions. Mais ils Ne devraient pas. Les propriétés sont conçues pour Être des méthodes très légères, Comparables à l'accès à un champ. Le programmeur Devrait pouvoir utiliser Comme un champ sans Conséquences sur les performances Notables. Il est donc fortement déconseillé de recourir à une logique de programme trop lourde . Et, bien que les préposés à la configuration puissent lancer des exceptions Si nécessaire, les getters devraient presque ne jamais lancer les exceptions

2
YetAnotherUser

public string Password { get; private set; }

2
Tahbaza

Pour obtenir un badge 'Excavator' et mettre à jour la réponse - champs en lecture seule encapsulés par une propriété get-only

private readonly int myVal;
public int MyVal get { return myVal; }

peut être maintenant (à partir de C # 6.0) raccourci à 

public int MyVal { get; }
0
Marc Wittke