web-dev-qa-db-fra.com

Existe-t-il une convention de dénomination C # pour une variable utilisée dans une propriété?

Disons que nous avons une variable que nous voulons nommée Fubar

Disons que Fubar est une String!

Cela signifie que nous définirions Fubar comme suit:

public string Fubar;

Maintenant, supposons que nous voulions Fubar avoir un getter et un setter (ou, en d'autres termes, devenir une propriété C #)!

private string Fubar;
public string Fubar_gs
{
    get
    {
        //Some fancy logic
        return Fubar;
    }
    set
    {
        //Some more fancy logic
        Fubar = value;
    }
}

Bien grande! Tout va bien, SAUF, si je voulais que la propriété s'appelle Fubar, pas la variable d'origine?

Bien évidemment, je voudrais renommer les deux variables. Mais le problème est, quel serait le meilleur nom pour la variable d'origine?

Existe-t-il une convention de dénomination pour cette situation?

41

Selon conventions de dénomination de Microsoft }, la méthode appropriée serait la suivante:

private string fubar;
public string Fubar { get { return fubar; } set { fubar = value; } }

Cependant, de nombreuses personnes préfèrent préfixer le champ privé par un trait de soulignement afin de minimiser les risques de mauvaise capitalisation et d'utilisation du champ lorsqu'ils ont l'intention d'utiliser la propriété, ou inversement.

Ainsi, il est fréquent de voir:

private string _fubar;
public string Fubar { get { return _fubar; } set { _fubar = value; } }

L'approche que vous prenez est finalement à vous. StyleCop appliquera le premier par défaut, tandis que ReSharper appliquera le second. 

En C # 6, une nouvelle syntaxe permet de déclarer les valeurs par défaut des propriétés ou de créer des propriétés en lecture seule, ce qui réduit le besoin de propriétés pour les champs de sauvegarde ne comportant aucune logique supplémentaire spéciale dans les méthodes get et set. Vous pouvez simplement écrire:

public string Fubar { get; set; } = "Default Value";

ou 

public string Fubar { get; } = "Read-only Value";

119
Daniel Mann

préfixez le privé avec un trait de soulignement _Fubar

9
Keith Nicholas

S'il n'y a pas de logique dans le getter/setter, utilisez une propriété auto:

public string Fubar {get; set;}

http://msdn.Microsoft.com/en-us/library/bb384054.aspx

6
Austin Salonen

Si vous nommez vos variables privées en commençant par des minuscules, vous pouvez cliquer dessus avec le bouton droit de la souris et faire en sorte que VS génère votre code getter/setter pour vous. 

Refactor> Champ Enacpsulate ...

Il nommera la propriété avec Caps.

5
Belmiris

Malheureusement, il n'y a pas de convention commune, vous devez choisir ce qui convient le mieux à votre cas. J'ai vu toutes les approches suivantes dans différentes bases de code.

Approche 1

private string _fubar;   //_camelCase
public string Fubar { ... }

Approche 2

private string fubar;    //camelCase
public string Fubar{ ... }

Approche 3

private string _Fubar;    //_PascalCase
public string Fubar{ ... }

Il existe également des frameworks qui demandent beaucoup de créativité, comme utiliser une propriété et la documenter en tant que variable membre, et donc utiliser le style des membres au lieu du style des propriétés (ouais, Unity! Je vous pointe du doigt, ainsi que la propriété/membre de votre MonoBehaviour.transform )

Pour lever l’ambiguïté dans notre base de code nous utilisons notre règle maison :

  • Essayez d'utiliser une dénomination plus appropriée, un membre utilisé dans une propriété publique ayant un objectif légèrement différent de celui de son homologue public, il est donc très possible de trouver un nom différent et correct. Dans le cas contraire, son objectif est simplement de conserver l'état pour la propriété publique, alors pourquoi ne pas la nommer nameValue ?
  • utiliser des propriétés si possible

Avec notre approche, la plupart du temps, nous évitons le doute sur le caractère de soulignement "_" tout en ayant un code beaucoup plus lisible.

private string fubarValue; //different name. Make sense 99% of times
public string Fubar { ... } 
2
GameDeveloper

La bonne chose à propos des normes de codage est qu’il existe un grand nombre de choix:

Choisissez une convention qui vous convient et utilisez-la de manière cohérente.

La convention Microsoft - les champs privés pascalCase et les propriétés CamelCase est ordonnée, mais peut entraîner des erreurs en raison de fautes de frappe. Je trouve la convention de soulignement inférieure agaçante car elle nécessite deux frappes de touche supplémentaires chaque fois que vous tapez le nom, mais vous n'obtenez pas trop de fautes de frappe (ou du moins le compilateur les intercepte en premier).

2
Nicholas Carey

Eh bien, le Framework Design Guidelines document indique ce qui suit:

Noms des champs Les consignes de dénomination des champs s'appliquent aux utilisateurs statiques publics et à champs protégés. Les champs internes et privés ne sont pas couverts par Les instructions et les champs d'instance publics ou protégés ne sont pas autorisés par les directives de conception des membres.

✓ UTILISEZ PascalCasing dans les noms de champs.

✓ DOIT nommer les champs en utilisant un nom, une phrase nominale ou un adjectif.

X NE PAS utiliser de préfixe pour les noms de champs.

Par exemple, n'utilisez pas "g_" ou "s_" pour indiquer des champs statiques.

Donc, pour les champs privés, il n'y a pas de recommandation officielle. Toutefois, si vous utilisez l'action rapide VS 2017 "Convertir en propriété complète" sur une propriété, cela se produit:

 VS 2017 quick action "Convert to full property"

Il semble donc raisonnable de supposer que la préfixe des champs private avec un trait de soulignement est quelque peu standard.

1
uceumern

La voie c # est

private string _fubar;
public string Fubar
{
    get
    {
        return _fubar;
    }
    set
    {
        _fubar = value;
    }
}

Cependant, s’il s’agit d’un simple getter/setter sans logique supplémentaire, vous pouvez simplement écrire

public string Fubar { get; set; }

Pas besoin d'une variable de sauvegarde ou quoi que ce soit.

1
CaffGeek

Une autre façon de déclarer avec une valeur par défaut

    private string _fubar = "Default Value";
    public string Fubar
    {
        get { return _fubar; }
        set { _fubar = value; }
    }
1

Alors que la plupart des développeurs suivent les directives de Microsoft, en tant que développeurs de jeux, nous suivons le style de Unity en tant que ( un des codes sources du script ici ):

static protected Material s_DefaultText = null;
protected bool m_DisableFontTextureRebuiltCallback = false;
public TextGenerator cachedTextGenerator { ... }
0
Richard Fu