C# : Conventions de nommage
PascalCase, camelCase, underscore - comment nommer ses variables, classes, méthodes et fichiers en C#.
C# : Conventions de nommage
En C#, les conventions de nommage ne sont pas juste cosmétiques. Elles sont quasi universelles dans l'écosystème .NET et respectées par tous les projets sérieux. Un développeur C# qui lit ton code s'attend à les voir - les enfreindre, c'est rendre le code plus difficile à lire pour tout le monde.
# Les conventions
PascalCase
Chaque mot commence par une majuscule, pas de séparateur.
MonNomDeVariable
CalculerTotal
VoitureElectriqueMonNomDeVariableCalculerTotalVoitureElectriqueUtilisé pour :
- Les noms de classes, structs, records, enums
- Les méthodes
- Les propriétés (publiques et privées)
- Les interfaces (avec le préfixe
I) - Les constantes
- Les événements
- Les namespaces
class VoitureElectrique // classe
{
public int Autonomie { get; set; } // propriété
public const int VitesseMax = 250; // constante
public void Demarrer() { } // méthode
public event Action OnDemarrage; // événement
}
interface IVehicule { } // interface
enum TypeCarburant { Essence, Diesel } // enumclass VoitureElectrique // classe{ public int Autonomie { get; set; } // propriété public const int VitesseMax = 250; // constante public void Demarrer() { } // méthode public event Action OnDemarrage; // événement} interface IVehicule { } // interfaceenum TypeCarburant { Essence, Diesel } // enumcamelCase
Premier mot en minuscule, les suivants en majuscule.
monNomDeVariable
compteurTotal
estActifmonNomDeVariablecompteurTotalestActifUtilisé pour :
- Les paramètres de méthodes
- Les variables locales
void Saluer(string nomUtilisateur, int ageMinimum)
{
bool estValide = ageMinimum >= 18;
string messageAccueil = $"Bonjour {nomUtilisateur}";
}void Saluer(string nomUtilisateur, int ageMinimum){ bool estValide = ageMinimum >= 18; string messageAccueil = $"Bonjour {nomUtilisateur}";}_camelCase (underscore prefix)
camelCase avec un _ devant.
_solde
_connexionDb
_estInitialise_solde_connexionDb_estInitialiseUtilisé pour :
- Les champs privés d'une classe
class CompteBancaire
{
private decimal _solde;
private readonly string _titulaire;
private bool _estActif;
public CompteBancaire(string titulaire, decimal soldeInitial)
{
_titulaire = titulaire;
_solde = soldeInitial;
_estActif = true;
}
public decimal GetSolde() => _solde;
}class CompteBancaire{ private decimal _solde; private readonly string _titulaire; private bool _estActif; public CompteBancaire(string titulaire, decimal soldeInitial) { _titulaire = titulaire; _solde = soldeInitial; _estActif = true; } public decimal GetSolde() => _solde;}Le _ évite la confusion avec les paramètres et les variables locales. Sans lui, tu te retrouves à écrire this.solde = solde partout.
UPPER_SNAKE_CASE
Tout en majuscules, séparé par des underscores.
MAX_RETRIES
DATABASE_CONNECTION_STRINGMAX_RETRIESDATABASE_CONNECTION_STRINGUtilisé pour :
- Rarement en C#. Certaines équipes l'utilisent pour les constantes, mais la convention officielle Microsoft préfère PascalCase même pour les constantes.
- On le croise surtout pour les variables d'environnement et les constantes de configuration.
// Convention officielle Microsoft
const int MaxRetries = 3;
// Acceptable dans certaines équipes (style C/C++)
const int MAX_RETRIES = 3;// Convention officielle Microsoftconst int MaxRetries = 3; // Acceptable dans certaines équipes (style C/C++)const int MAX_RETRIES = 3;# Récapitulatif
| Élément | Convention | Exemple |
|---|---|---|
| Classe, struct, record | PascalCase | VoitureElectrique |
| Interface | I + PascalCase | IVehicule |
| Enum | PascalCase | TypeCarburant |
| Valeur d'enum | PascalCase | TypeCarburant.Essence |
| Méthode | PascalCase | CalculerTotal() |
| Propriété | PascalCase | NomComplet |
| Événement | PascalCase | OnClicked |
| Constante | PascalCase | MaxRetries |
| Namespace | PascalCase | MonProjet.Services |
| Paramètre | camelCase | nomUtilisateur |
| Variable locale | camelCase | compteurTotal |
| Champ privé | _camelCase | _solde |
# Les erreurs courantes
Nommer un booléen sans préfixe
// MAL - on ne sait pas ce que "actif" signifie
bool actif = true;
// BIEN - la question est dans le nom
bool estActif = true;
bool aDesEnfants = false;
bool peutModifier = true;// MAL - on ne sait pas ce que "actif" signifiebool actif = true; // BIEN - la question est dans le nombool estActif = true;bool aDesEnfants = false;bool peutModifier = true;Les booléens doivent se lire comme une question oui/non. Les préfixes courants : est (is), a (has), peut (can), doit (should).
Abréviations
// MAL
int nb = 5;
string msg = "Hello";
var btn = new Button();
DateTime dt = DateTime.Now;
// BIEN
int nombre = 5;
string message = "Hello";
var bouton = new Button();
DateTime dateCreation = DateTime.Now;// MALint nb = 5;string msg = "Hello";var btn = new Button();DateTime dt = DateTime.Now; // BIENint nombre = 5;string message = "Hello";var bouton = new Button();DateTime dateCreation = DateTime.Now;Les abréviations rendent le code illisible pour quelqu'un qui ne connaît pas le contexte. Exception : les acronymes courants comme Id, Url, Html, Xml sont acceptés.
Sigles et acronymes
Les acronymes de 2 lettres restent en majuscules. Les acronymes de 3+ lettres suivent PascalCase :
// 2 lettres - tout en majuscules
IOStream
UIElement
DBContext
// 3+ lettres - PascalCase
XmlParser // pas XMLParser
HtmlHelper // pas HTMLHelper
HttpClient // pas HTTPClient// 2 lettres - tout en majusculesIOStreamUIElementDBContext // 3+ lettres - PascalCaseXmlParser // pas XMLParserHtmlHelper // pas HTMLHelperHttpClient // pas HTTPClientNommer les interfaces sans le I
// MAL
interface Vehicule { }
// BIEN
interface IVehicule { }// MALinterface Vehicule { } // BIENinterface IVehicule { }Le I est obligatoire par convention. Sans lui, on confond interface et classe.
# Conseils pratiques
- Un nom doit expliquer le "quoi", pas le "comment" -
CalculerTotal()plutôt queBouclerEtAdditionner() - Les méthodes sont des verbes -
Démarrer(),Calculer(),Envoyer() - Les propriétés sont des noms -
Nom,Âge,EstActif - Les classes sont des noms au singulier -
Voiture, pasVoitures(sauf les collections) - Pas de type dans le nom -
string nompasstring strNom,List<int> agespasList<int> listeAges - En anglais ou en français, mais pas les deux - choisis une langue et tiens-toi à elle dans tout le projet
Dans l'industrie, le code est le plus souvent en anglais, mais ça dépend des conventions de l'entreprise. Certaines équipes françaises codent en français. L'important c'est de choisir une langue et de s'y tenir dans tout le projet.
# La suite
Découvre aussi les autres articles de la série :
- La syntaxe - variables, opérateurs, structures de contrôle
- Les objets - classes, constructeurs, propriétés, héritage
- Les exceptions - try/catch, bonnes pratiques