Skip to content

Méthodes des Types Natifs

Introduction

En C#, chaque type de données possède des méthodes intégrées qui permettent de manipuler et d'interroger les valeurs de ce type. Ces méthodes sont très utiles pour effectuer des opérations courantes sans avoir à écrire du code complexe.

Dans ce chapitre, nous allons explorer les méthodes les plus importantes des types natifs de C# : string, int, double, bool, char, et DateTime.

1. Type string

Le type string est l'un des plus riches en méthodes utiles pour manipuler du texte.

Tableau des méthodes principales

MéthodeSignatureDescription
Lengthint Length { get; }Propriété qui retourne la longueur de la chaîne
ToUpper()string ToUpper()Convertit tous les caractères en majuscules
ToLower()string ToLower()Convertit tous les caractères en minuscules
Trim()string Trim()Supprime les espaces en début et fin de chaîne
Substring()string Substring(int startIndex, int length)Extrait une sous-chaîne
IndexOf()int IndexOf(string value)Trouve l'index de la première occurrence d'une sous-chaîne
Contains()bool Contains(string value)Vérifie si la chaîne contient une sous-chaîne
StartsWith()bool StartsWith(string value)Vérifie si la chaîne commence par une sous-chaîne
EndsWith()bool EndsWith(string value)Vérifie si la chaîne se termine par une sous-chaîne
Replace()string Replace(string oldValue, string newValue)Remplace toutes les occurrences d'une sous-chaîne
Split()string[] Split(char separator)Divise la chaîne en tableau selon un séparateur
IsNullOrEmpty()static bool IsNullOrEmpty(string value)Vérifie si une chaîne est null ou vide

Exemples pratiques

csharp
using System;

class Program
{
    static void Main()
    {
        string texte = "  Bonjour le Monde!  ";
        
        // Length - Obtenir la longueur
        Console.WriteLine($"Longueur: {texte.Length}"); // Affiche: 20
        
        // Cas d'usage pratique : vérifier si un mot de passe a la bonne longueur
        string motDePasse = "MonMotDePasse123";
        if (motDePasse.Length >= 8)
        {
            Console.WriteLine("Mot de passe assez long");
        }
        
        // ToUpper() - Convertir en majuscules
        Console.WriteLine($"Majuscules: {texte.ToUpper()}"); // Affiche: "  BONJOUR LE MONDE!  "
        
        // Cas d'usage : comparaison insensible à la casse
        string nom1 = "ALICE";
        string nom2 = "alice";
        if (nom1.ToUpper() == nom2.ToUpper())
        {
            Console.WriteLine("Les noms sont identiques (insensible à la casse)");
        }
        
        // ToLower() - Convertir en minuscules
        Console.WriteLine($"Minuscules: {texte.ToLower()}"); // Affiche: "  bonjour le monde!  "
        
        // Cas d'usage : normaliser l'entrée utilisateur
        string entreeUtilisateur = "OUI";
        string reponseNormalisee = entreeUtilisateur.ToLower();
        if (reponseNormalisee == "oui" || reponseNormalisee == "yes")
        {
            Console.WriteLine("L'utilisateur a dit oui");
        }
        
        // Trim() - Supprimer les espaces
        string textePropre = texte.Trim();
        Console.WriteLine($"Sans espaces: '{textePropre}'"); // Affiche: "Bonjour le Monde!"
        
        // Cas d'usage : nettoyer l'entrée utilisateur
        string entree = "   alice@example.com   ";
        string emailPropre = entree.Trim();
        Console.WriteLine($"Email nettoyé: '{emailPropre}'");
        
        // Trim avec caractères spécifiques
        string texteAvecPoints = "...Bonjour...";
        string sansPoints = texteAvecPoints.Trim('.');
        Console.WriteLine($"Sans points: '{sansPoints}'"); // "Bonjour"
        
        // Substring() - Extraire une partie
        Console.WriteLine($"Sous-chaîne: {textePropre.Substring(0, 7)}"); // Affiche: "Bonjour"
        Console.WriteLine($"À partir de l'index 8: {textePropre.Substring(8)}"); // Affiche: "le Monde!"
        
        // Cas d'usage : extraire le nom de domaine d'un email
        string email = "utilisateur@example.com";
        int positionArobase = email.IndexOf('@');
        if (positionArobase >= 0)
        {
            string nomUtilisateur = email.Substring(0, positionArobase);
            string domaine = email.Substring(positionArobase + 1);
            Console.WriteLine($"Utilisateur: {nomUtilisateur}, Domaine: {domaine}");
        }
        
        // Cas d'usage : extraire l'extension d'un fichier
        string nomFichier = "document.pdf";
        int positionPoint = nomFichier.LastIndexOf('.');
        if (positionPoint >= 0)
        {
            string extension = nomFichier.Substring(positionPoint + 1);
            Console.WriteLine($"Extension: {extension}"); // "pdf"
        }
        
        // IndexOf() - Trouver une position
        int position = textePropre.IndexOf("Monde");
        Console.WriteLine($"Position de 'Monde': {position}"); // Affiche: 11
        
        // Cas d'usage : vérifier si un texte contient un mot interdit
        string commentaire = "Ce produit est vraiment nul";
        string[] motsInterdits = {"nul", "mauvais", "horrible"};
        foreach (string motInterdit in motsInterdits)
        {
            if (commentaire.ToLower().IndexOf(motInterdit) >= 0)
            {
                Console.WriteLine($"Mot interdit trouvé: {motInterdit}");
                break;
            }
        }
        
        // LastIndexOf() - Trouver la dernière occurrence
        string phrase = "Le chat mange le poisson";
        int dernierLe = phrase.LastIndexOf("le");
        Console.WriteLine($"Dernière position de 'le': {dernierLe}");
        
        // Contains() - Vérifier la présence
        bool contient = textePropre.Contains("Bonjour");
        Console.WriteLine($"Contient 'Bonjour': {contient}"); // Affiche: True
        
        // Cas d'usage : filtrer des éléments
        string[] produits = {"iPhone", "Samsung Galaxy", "Google Pixel", "Huawei P40"};
        Console.WriteLine("Produits contenant 'Phone':");
        foreach (string produit in produits)
        {
            if (produit.ToLower().Contains("phone"))
            {
                Console.WriteLine($"- {produit}");
            }
        }
        
        // StartsWith() et EndsWith() - Vérifier le début et la fin
        Console.WriteLine($"Commence par 'Bonjour': {textePropre.StartsWith("Bonjour")}"); // True
        Console.WriteLine($"Se termine par '!': {textePropre.EndsWith("!")}"); // True
        
        // Cas d'usage : traiter différents types de fichiers
        string[] fichiers = {"document.pdf", "image.jpg", "script.js", "style.css"};
        foreach (string fichier in fichiers)
        {
            if (fichier.EndsWith(".pdf"))
            {
                Console.WriteLine($"{fichier} est un document PDF");
            }
            else if (fichier.EndsWith(".jpg") || fichier.EndsWith(".png"))
            {
                Console.WriteLine($"{fichier} est une image");
            }
            else if (fichier.EndsWith(".js"))
            {
                Console.WriteLine($"{fichier} est un script JavaScript");
            }
        }
        
        // Cas d'usage : valider les URLs
        string[] urls = {"https://example.com", "http://test.org", "ftp://files.com"};
        foreach (string url in urls)
        {
            if (url.StartsWith("https://"))
            {
                Console.WriteLine($"{url} est sécurisé (HTTPS)");
            }
            else if (url.StartsWith("http://"))
            {
                Console.WriteLine($"{url} n'est pas sécurisé (HTTP)");
            }
        }
        
        // Replace() - Remplacer du texte
        string nouveau = textePropre.Replace("Monde", "Univers");
        Console.WriteLine($"Remplacé: {nouveau}"); // Affiche: "Bonjour le Univers!"
        
        // Cas d'usage : nettoyer un texte
        string texteAvecErreurs = "Bnojour tout le mnde!";
        string texteCorrige = texteAvecErreurs.Replace("Bnojour", "Bonjour")
                                             .Replace("mnde", "monde");
        Console.WriteLine($"Texte corrigé: {texteCorrige}");
        
        // Cas d'usage : formater un numéro de téléphone
        string numeroTelephone = "0123456789";
        string numeroFormate = numeroTelephone.Replace("", "-"); // Ne fonctionne pas ainsi
        // Meilleure approche pour formater un numéro :
        if (numeroTelephone.Length == 10)
        {
            numeroFormate = $"{numeroTelephone.Substring(0, 2)}-{numeroTelephone.Substring(2, 2)}-{numeroTelephone.Substring(4, 2)}-{numeroTelephone.Substring(6, 2)}-{numeroTelephone.Substring(8, 2)}";
            Console.WriteLine($"Numéro formaté: {numeroFormate}");
        }
        
        // Replace multiple
        string texteHTML = "<p>Bonjour <b>monde</b></p>";
        string textePropre2 = texteHTML.Replace("<p>", "")
                                      .Replace("</p>", "")
                                      .Replace("<b>", "")
                                      .Replace("</b>", "");
        Console.WriteLine($"Texte sans HTML: {textePropre2}");
        
        // Split() - Diviser en mots
        string phrase2 = "pomme,banane,orange";
        string[] fruits = phrase2.Split(',');
        Console.WriteLine("Fruits:");
        foreach (string fruit in fruits)
        {
            Console.WriteLine($"- {fruit}");
        }
        
        // Cas d'usage : parser un fichier CSV
        string lignCSV = "Jean,Dupont,30,Bruxelles";
        string[] donnees = lignCSV.Split(',');
        if (donnees.Length >= 4)
        {
            Console.WriteLine($"Prénom: {donnees[0]}");
            Console.WriteLine($"Nom: {donnees[1]}");
            Console.WriteLine($"Âge: {donnees[2]}");
            Console.WriteLine($"Ville: {donnees[3]}");
        }
        
        // Split avec plusieurs séparateurs
        string phraseComplexe = "pomme;banane,orange:fraise";
        string[] fruitsComplexes = phraseComplexe.Split(new char[] {';', ',', ':'});
        Console.WriteLine("Fruits complexes:");
        foreach (string fruit in fruitsComplexes)
        {
            Console.WriteLine($"- {fruit}");
        }
        
        // Split pour diviser en mots
        string phraseComplete = "Bonjour tout le monde";
        string[] mots = phraseComplete.Split(' ');
        Console.WriteLine($"Cette phrase contient {mots.Length} mots:");
        for (int i = 0; i < mots.Length; i++)
        {
            Console.WriteLine($"Mot {i + 1}: {mots[i]}");
        }
        
        // IsNullOrEmpty() - Vérifier si vide ou null
        string vide = "";
        string nulle = null;
        string avecEspaces = "   ";
        Console.WriteLine($"Chaîne vide: {string.IsNullOrEmpty(vide)}"); // True
        Console.WriteLine($"Chaîne null: {string.IsNullOrEmpty(nulle)}"); // True
        Console.WriteLine($"Chaîne normale: {string.IsNullOrEmpty(textePropre)}"); // False
        Console.WriteLine($"Chaîne avec espaces: {string.IsNullOrEmpty(avecEspaces)}"); // False
        
        // IsNullOrWhiteSpace() - Plus strict
        Console.WriteLine($"Chaîne avec espaces (WhiteSpace): {string.IsNullOrWhiteSpace(avecEspaces)}"); // True
        
        // Cas d'usage : valider l'entrée utilisateur
        Console.WriteLine("Entrez votre nom:");
        string nomUtilisateur = ""; // Simuler une entrée vide
        if (string.IsNullOrWhiteSpace(nomUtilisateur))
        {
            Console.WriteLine("Erreur: Le nom ne peut pas être vide");
        }
        else
        {
            Console.WriteLine($"Bonjour {nomUtilisateur.Trim()}!");
        }
        
        // Exemple complet : valider et formater une adresse email
        string emailAValider = "  ALICE@EXAMPLE.COM  ";
        string emailValide = "";
        
        if (!string.IsNullOrWhiteSpace(emailAValider))
        {
            emailValide = emailAValider.Trim().ToLower();
            
            if (emailValide.Contains("@") && emailValide.Contains("."))
            {
                Console.WriteLine($"Email valide: {emailValide}");
                
                // Extraire les parties
                string[] partiesEmail = emailValide.Split('@');
                if (partiesEmail.Length == 2)
                {
                    string utilisateur = partiesEmail[0];
                    string domaine = partiesEmail[1];
                    Console.WriteLine($"Utilisateur: {utilisateur}, Domaine: {domaine}");
                }
            }
            else
            {
                Console.WriteLine("Format d'email invalide");
            }
        }
        else
        {
            Console.WriteLine("Email ne peut pas être vide");
        }
    }
}

2. Type int

Le type int possède plusieurs méthodes utiles pour la manipulation des nombres entiers.

Tableau des méthodes principales

MéthodeSignatureDescription
ToString()string ToString()Convertit l'entier en chaîne de caractères
Parse()static int Parse(string s)Convertit une chaîne en entier
TryParse()static bool TryParse(string s, out int result)Tente de convertir une chaîne en entier
CompareTo()int CompareTo(int value)Compare deux entiers
Equals()bool Equals(int obj)Vérifie l'égalité avec un autre entier
GetHashCode()int GetHashCode()Retourne le code de hachage
MaxValueconst int MaxValueValeur maximale d'un int
MinValueconst int MinValueValeur minimale d'un int

Exemples pratiques

csharp
using System;

class Program
{
    static void Main()
    {
        int nombre = 42;
        
        // ToString() - Convertir en chaîne
        string texte = nombre.ToString();
        Console.WriteLine($"En texte: '{texte}'"); // Affiche: "42"
        
        // Cas d'usage : afficher un score
        int score = 1250;
        Console.WriteLine("Votre score est: " + score.ToString());
        
        // Formatage avec ToString()
        int argent = 1234567;
        Console.WriteLine($"Montant: {argent.ToString("N0")}"); // Affiche: "1,234,567"
        Console.WriteLine($"Montant: {argent.ToString("C")}"); // Affiche le montant en devise locale
        
        // Parse() - Convertir depuis une chaîne
        string chaine = "123";
        int converti = int.Parse(chaine);
        Console.WriteLine($"Converti: {converti}"); // Affiche: 123
        
        // Cas d'usage : calculer avec des entrées utilisateur
        string age1 = "25";
        string age2 = "30";
        int sommeAges = int.Parse(age1) + int.Parse(age2);
        Console.WriteLine($"Somme des âges: {sommeAges}"); // 55
        
        // Attention aux exceptions avec Parse()
        try
        {
            string chaineInvalide = "abc";
            int resultatErreur = int.Parse(chaineInvalide); // Lève une exception
        }
        catch (FormatException)
        {
            Console.WriteLine("Erreur: Format invalide pour Parse()");
        }
        
        // TryParse() - Conversion sécurisée
        string chaineInvalide2 = "abc";
        bool succes = int.TryParse(chaineInvalide2, out int resultat);
        Console.WriteLine($"Conversion réussie: {succes}"); // False
        Console.WriteLine($"Résultat: {resultat}"); // 0 (valeur par défaut)
        
        string chaineValide = "456";
        succes = int.TryParse(chaineValide, out resultat);
        Console.WriteLine($"Conversion réussie: {succes}"); // True
        Console.WriteLine($"Résultat: {resultat}"); // 456
        
        // Cas d'usage pratique : saisie sécurisée
        string[] entrees = {"42", "abc", "0", "-15", "999999999999"}; // Simule différentes entrées
        foreach (string entree in entrees)
        {
            if (int.TryParse(entree, out int valeur))
            {
                if (valeur >= 0)
                {
                    Console.WriteLine($"Valeur valide: {valeur}");
                }
                else
                {
                    Console.WriteLine($"Valeur négative: {valeur}");
                }
            }
            else
            {
                Console.WriteLine($"'{entree}' n'est pas un nombre valide");
            }
        }
        
        // Cas d'usage : menu interactif
        string[] options = {"1", "2", "abc", "3"};
        foreach (string choix in options)
        {
            if (int.TryParse(choix, out int option))
            {
                switch (option)
                {
                    case 1:
                        Console.WriteLine("Option 1 sélectionnée");
                        break;
                    case 2:
                        Console.WriteLine("Option 2 sélectionnée");
                        break;
                    case 3:
                        Console.WriteLine("Option 3 sélectionnée");
                        break;
                    default:
                        Console.WriteLine($"Option {option} non reconnue");
                        break;
                }
            }
            else
            {
                Console.WriteLine($"'{choix}' n'est pas une option valide");
            }
        }
        
        // CompareTo() - Comparer
        int autre = 30;
        int comparaison = nombre.CompareTo(autre);
        Console.WriteLine($"42 comparé à 30: {comparaison}"); // 1 (42 > 30)
        
        comparaison = autre.CompareTo(nombre);
        Console.WriteLine($"30 comparé à 42: {comparaison}"); // -1 (30 < 42)
        
        comparaison = nombre.CompareTo(42);
        Console.WriteLine($"42 comparé à 42: {comparaison}"); // 0 (égal)
        
        // Cas d'usage : trier des nombres
        int[] nombres = {15, 3, 42, 8, 23};
        Console.WriteLine("Nombres avant tri:");
        foreach (int n in nombres)
        {
            Console.Write($"{n} ");
        }
        Console.WriteLine();
        
        // Tri simple avec CompareTo (tri à bulles)
        for (int i = 0; i < nombres.Length - 1; i++)
        {
            for (int j = 0; j < nombres.Length - i - 1; j++)
            {
                if (nombres[j].CompareTo(nombres[j + 1]) > 0)
                {
                    // Échanger
                    int temp = nombres[j];
                    nombres[j] = nombres[j + 1];
                    nombres[j + 1] = temp;
                }
            }
        }
        
        Console.WriteLine("Nombres après tri:");
        foreach (int n in nombres)
        {
            Console.Write($"{n} ");
        }
        Console.WriteLine();
        
        // Cas d'usage : trouver le minimum et maximum
        int[] valeurs = {42, 15, 88, 3, 67};
        int min = valeurs[0];
        int max = valeurs[0];
        
        foreach (int valeur in valeurs)
        {
            if (valeur.CompareTo(min) < 0)
            {
                min = valeur;
            }
            if (valeur.CompareTo(max) > 0)
            {
                max = valeur;
            }
        }
        Console.WriteLine($"Minimum: {min}, Maximum: {max}");
        
        // Equals() - Vérifier l'égalité
        bool egal = nombre.Equals(42);
        Console.WriteLine($"42 égal à 42: {egal}"); // True
        
        // Cas d'usage : vérifier des conditions spécifiques
        int[] scoresGagnants = {100, 200, 500, 1000};
        int scoreJoueur = 500;
        
        bool scoreGagnant = false;
        foreach (int scoreGagnant in scoresGagnants)
        {
            if (scoreJoueur.Equals(scoreGagnant))
            {
                scoreGagnant = true;
                Console.WriteLine($"Félicitations! Vous avez atteint un score gagnant: {scoreJoueur}");
                break;
            }
        }
        
        if (!scoreGagnant)
        {
            Console.WriteLine($"Score actuel: {scoreJoueur}. Continuez à jouer!");
        }
        
        // MaxValue et MinValue - Limites
        Console.WriteLine($"Valeur max d'un int: {int.MaxValue}"); // 2147483647
        Console.WriteLine($"Valeur min d'un int: {int.MinValue}"); // -2147483648
        
        // Cas d'usage : vérifier les débordements
        int grandNombre = int.MaxValue;
        Console.WriteLine($"Grand nombre: {grandNombre}");
        
        // Vérifier avant d'additionner pour éviter le débordement
        int aAjouter = 10;
        if (grandNombre <= int.MaxValue - aAjouter)
        {
            grandNombre += aAjouter;
            Console.WriteLine($"Addition réussie: {grandNombre}");
        }
        else
        {
            Console.WriteLine("Addition impossible: risque de débordement");
        }
        
        // Cas d'usage : validation de plages
        int ageUtilisateur = 150;
        if (ageUtilisateur >= 0 && ageUtilisateur <= 120)
        {
            Console.WriteLine($"Âge valide: {ageUtilisateur}");
        }
        else
        {
            Console.WriteLine($"Âge invalide: {ageUtilisateur}");
        }
        
        // Exemple pratique : calculatrice simple
        string[] expressions = {"10+5", "20-8", "abc+5", "15*3"};
        foreach (string expr in expressions)
        {
            Console.WriteLine($"Expression: {expr}");
            
            if (expr.Contains("+"))
            {
                string[] parties = expr.Split('+');
                if (parties.Length == 2 && 
                    int.TryParse(parties[0], out int a) && 
                    int.TryParse(parties[1], out int b))
                {
                    Console.WriteLine($"Résultat: {a + b}");
                }
                else
                {
                    Console.WriteLine("Format invalide pour addition");
                }
            }
            else if (expr.Contains("-"))
            {
                string[] parties = expr.Split('-');
                if (parties.Length == 2 && 
                    int.TryParse(parties[0], out int a) && 
                    int.TryParse(parties[1], out int b))
                {
                    Console.WriteLine($"Résultat: {a - b}");
                }
                else
                {
                    Console.WriteLine("Format invalide pour soustraction");
                }
            }
            else
            {
                Console.WriteLine("Opération non supportée");
            }
            Console.WriteLine();
        }
    }
}

3. Type double

Le type double partage beaucoup de méthodes avec int, mais possède des spécificités pour les nombres à virgule flottante.

Tableau des méthodes principales

MéthodeSignatureDescription
ToString()string ToString()Convertit le double en chaîne
Parse()static double Parse(string s)Convertit une chaîne en double
TryParse()static bool TryParse(string s, out double result)Tente de convertir une chaîne en double
CompareTo()int CompareTo(double value)Compare deux doubles
Equals()bool Equals(double obj)Vérifie l'égalité
IsNaN()static bool IsNaN(double d)Vérifie si la valeur est "Not a Number"
IsInfinity()static bool IsInfinity(double d)Vérifie si la valeur est infinie
MaxValueconst double MaxValueValeur maximale d'un double
MinValueconst double MinValueValeur minimale d'un double

Exemples pratiques

csharp
using System;

class Program
{
    static void Main()
    {
        double nombre = 3.14159;
        
        // ToString() - Convertir en chaîne
        Console.WriteLine($"En texte: {nombre.ToString()}"); // Affiche: "3.14159"
        
        // Formatage personnalisé
        Console.WriteLine($"2 décimales: {nombre.ToString("F2")}"); // "3.14"
        Console.WriteLine($"4 décimales: {nombre.ToString("F4")}"); // "3.1416"
        Console.WriteLine($"Format pourcentage: {(0.85).ToString("P")}"); // "85.00%"
        Console.WriteLine($"Format scientifique: {(123456.789).ToString("E")}"); // "1.234568E+005"
        
        // Cas d'usage : afficher des prix
        double prix = 19.99;
        Console.WriteLine($"Prix: {prix.ToString("C")}"); // Format devise locale
        Console.WriteLine($"Prix: {prix.ToString("F2")} €"); // "19.99 €"
        
        // Parse() - Convertir depuis une chaîne
        double converti = double.Parse("2.718");
        Console.WriteLine($"Converti: {converti}"); // 2.718
        
        // Parse avec différents formats
        double nombre1 = double.Parse("3.14");
        double nombre2 = double.Parse("2.5e3"); // Notation scientifique: 2500
        Console.WriteLine($"Nombre1: {nombre1}, Nombre2: {nombre2}");
        
        // Attention aux séparateurs décimaux selon la culture
        try
        {
            double test1 = double.Parse("3.14"); // Point décimal (EN-US)
            double test2 = double.Parse("3,14"); // Virgule décimale (FR-FR)
            Console.WriteLine($"Test1: {test1}, Test2: {test2}");
        }
        catch (FormatException ex)
        {
            Console.WriteLine($"Erreur de format: {ex.Message}");
        }
        
        // TryParse() - Conversion sécurisée
        bool succes = double.TryParse("1.5", out double resultat);
        Console.WriteLine($"Conversion réussie: {succes}, Résultat: {resultat}"); // True, 1.5
        
        succes = double.TryParse("abc", out resultat);
        Console.WriteLine($"Conversion échouée: {succes}, Résultat: {resultat}"); // False, 0
        
        // Cas d'usage : calcul de moyennes
        string[] notesTexte = {"15.5", "12.0", "18.25", "abc", "14.75"};
        double somme = 0;
        int nombreNotes = 0;
        
        Console.WriteLine("Traitement des notes:");
        foreach (string noteTexte in notesTexte)
        {
            if (double.TryParse(noteTexte, out double note))
            {
                if (note >= 0 && note <= 20)
                {
                    somme += note;
                    nombreNotes++;
                    Console.WriteLine($"Note valide: {note}");
                }
                else
                {
                    Console.WriteLine($"Note hors limites: {note}");
                }
            }
            else
            {
                Console.WriteLine($"Format invalide: {noteTexte}");
            }
        }
        
        if (nombreNotes > 0)
        {
            double moyenne = somme / nombreNotes;
            Console.WriteLine($"Moyenne: {moyenne.ToString("F2")}");
        }
        
        // CompareTo() - Comparer
        double autre = 2.5;
        int comparaison = nombre.CompareTo(autre);
        Console.WriteLine($"3.14159 comparé à 2.5: {comparaison}"); // 1 (plus grand)
        
        // Attention avec les nombres à virgule flottante
        double a = 0.1 + 0.2;
        double b = 0.3;
        Console.WriteLine($"0.1 + 0.2 = {a}");
        Console.WriteLine($"0.3 = {b}");
        Console.WriteLine($"Sont-ils égaux? {a == b}"); // Probablement False !
        
        // Meilleure approche pour comparer les doubles
        double tolerance = 0.0001;
        bool approximativementEgaux = Math.Abs(a - b) < tolerance;
        Console.WriteLine($"Approximativement égaux? {approximativementEgaux}");
        
        // Cas d'usage : calculateur scientifique
        double[] valeurs = {2.5, 3.7, 1.2, 5.8, 4.1};
        
        // Trouver min et max
        double min = valeurs[0];
        double max = valeurs[0];
        
        foreach (double valeur in valeurs)
        {
            if (valeur.CompareTo(min) < 0) min = valeur;
            if (valeur.CompareTo(max) > 0) max = valeur;
        }
        
        Console.WriteLine($"Minimum: {min}, Maximum: {max}");
        Console.WriteLine($"Étendue: {(max - min).ToString("F2")}");
        
        // Gestion des valeurs spéciales
        double divisionParZero = 1.0 / 0.0; // Infinity
        double operationInvalide = Math.Sqrt(-1); // NaN
        double infiniNegatif = -1.0 / 0.0; // -Infinity
        
        Console.WriteLine($"Division par zéro: {divisionParZero}");
        Console.WriteLine($"Racine de -1: {operationInvalide}");
        Console.WriteLine($"Infini négatif: {infiniNegatif}");
        
        Console.WriteLine($"Est infini: {double.IsInfinity(divisionParZero)}"); // True
        Console.WriteLine($"Est NaN: {double.IsNaN(operationInvalide)}"); // True
        Console.WriteLine($"Est infini positif: {double.IsPositiveInfinity(divisionParZero)}"); // True
        Console.WriteLine($"Est infini négatif: {double.IsNegativeInfinity(infiniNegatif)}"); // True
        
        // Cas d'usage : validation de calculs
        double[] operations = {Math.Sqrt(4), Math.Sqrt(-1), 10.0/0.0, 0.0/0.0};
        string[] descriptions = {"Racine de 4", "Racine de -1", "10/0", "0/0"};
        
        for (int i = 0; i < operations.Length; i++)
        {
            double operation = operations[i];
            string description = descriptions[i];
            
            Console.WriteLine($"{description}: {operation}");
            
            if (double.IsNaN(operation))
            {
                Console.WriteLine("  → Résultat invalide (NaN)");
            }
            else if (double.IsInfinity(operation))
            {
                Console.WriteLine("  → Résultat infini");
            }
            else
            {
                Console.WriteLine($"  → Résultat valide: {operation.ToString("F2")}");
            }
        }
        
        // Cas d'usage : calculs financiers
        double capitalInitial = 1000.0;
        double tauxInteret = 0.05; // 5%
        int annees = 10;
        
        double capitalFinal = capitalInitial;
        Console.WriteLine($"Capital initial: {capitalInitial.ToString("C")}");
        Console.WriteLine($"Taux d'intérêt: {tauxInteret.ToString("P")}");
        
        for (int annee = 1; annee <= annees; annee++)
        {
            capitalFinal *= (1 + tauxInteret);
            Console.WriteLine($"Année {annee}: {capitalFinal.ToString("C")}");
        }
        
        double benefice = capitalFinal - capitalInitial;
        Console.WriteLine($"Bénéfice total: {benefice.ToString("C")}");
        
        // Limites
        Console.WriteLine($"Valeur max: {double.MaxValue}");
        Console.WriteLine($"Valeur min: {double.MinValue}");
        Console.WriteLine($"Plus petite valeur positive: {double.Epsilon}");
        
        // Cas d'usage : détection de débordement
        double grandNombre = double.MaxValue;
        double resultatMultiplication = grandNombre * 2;
        
        if (double.IsInfinity(resultatMultiplication))
        {
            Console.WriteLine("Attention: Débordement détecté, résultat infini");
        }
        else
        {
            Console.WriteLine($"Multiplication réussie: {resultatMultiplication}");
        }
    }
}

4. Type bool

Le type bool a des méthodes simples mais importantes.

Tableau des méthodes principales

MéthodeSignatureDescription
ToString()string ToString()Convertit le booléen en chaîne
Parse()static bool Parse(string value)Convertit une chaîne en booléen
TryParse()static bool TryParse(string value, out bool result)Tente de convertir une chaîne en booléen
CompareTo()int CompareTo(bool value)Compare deux booléens
Equals()bool Equals(bool obj)Vérifie l'égalité

Exemples pratiques

csharp
using System;

class Program
{
    static void Main()
    {
        bool vrai = true;
        bool faux = false;
        
        // ToString() - Convertir en chaîne
        Console.WriteLine($"Vrai en texte: {vrai.ToString()}"); // "True"
        Console.WriteLine($"Faux en texte: {faux.ToString()}"); // "False"
        
        // Cas d'usage : afficher l'état d'un système
        bool serveurActif = true;
        bool maintenanceEnCours = false;
        Console.WriteLine($"Serveur actif: {serveurActif.ToString()}");
        Console.WriteLine($"Maintenance: {maintenanceEnCours.ToString()}");
        
        // Parse() - Convertir depuis une chaîne
        bool converti1 = bool.Parse("True");
        bool converti2 = bool.Parse("false"); // Insensible à la casse
        bool converti3 = bool.Parse("TRUE");
        Console.WriteLine($"Converti1: {converti1}"); // True
        Console.WriteLine($"Converti2: {converti2}"); // False
        Console.WriteLine($"Converti3: {converti3}"); // True
        
        // Attention aux exceptions avec Parse()
        try
        {
            bool erreur = bool.Parse("yes"); // Lève une exception
        }
        catch (FormatException)
        {
            Console.WriteLine("Erreur: seuls 'true' et 'false' sont acceptés par Parse()");
        }
        
        // TryParse() - Conversion sécurisée
        bool succes = bool.TryParse("yes", out bool resultat);
        Console.WriteLine($"Conversion de 'yes' réussie: {succes}"); // False
        Console.WriteLine($"Résultat: {resultat}"); // False (valeur par défaut)
        
        succes = bool.TryParse("TRUE", out resultat);
        Console.WriteLine($"Conversion de 'TRUE' réussie: {succes}, Résultat: {resultat}"); // True, True
        
        // Cas d'usage : traitement d'entrées utilisateur variées
        string[] entrees = {"true", "false", "TRUE", "False", "yes", "no", "1", "0", "oui"};
        
        foreach (string entree in entrees)
        {
            Console.WriteLine($"Traitement de '{entree}':");
            
            if (bool.TryParse(entree, out bool valeurBool))
            {
                Console.WriteLine($"  → Valeur booléenne: {valeurBool}");
            }
            else
            {
                // Logique personnalisée pour d'autres formats
                string entreeLower = entree.ToLower();
                if (entreeLower == "yes" || entreeLower == "oui" || entreeLower == "1")
                {
                    Console.WriteLine($"  → Interprété comme: True");
                }
                else if (entreeLower == "no" || entreeLower == "non" || entreeLower == "0")
                {
                    Console.WriteLine($"  → Interprété comme: False");
                }
                else
                {
                    Console.WriteLine($"  → Format non reconnu");
                }
            }
        }
        
        // CompareTo() - Comparer (false < true)
        int comparaison = vrai.CompareTo(faux);
        Console.WriteLine($"true comparé à false: {comparaison}"); // 1
        
        comparaison = faux.CompareTo(vrai);
        Console.WriteLine($"false comparé à true: {comparaison}"); // -1
        
        comparaison = vrai.CompareTo(true);
        Console.WriteLine($"true comparé à true: {comparaison}"); // 0
        
        // Cas d'usage : tri de valeurs booléennes
        bool[] valeurs = {true, false, true, false, true};
        Console.WriteLine("Avant tri:");
        foreach (bool val in valeurs)
        {
            Console.Write($"{val} ");
        }
        Console.WriteLine();
        
        // Tri simple (false en premier, true en second)
        Array.Sort(valeurs); // Utilise CompareTo automatiquement
        Console.WriteLine("Après tri:");
        foreach (bool val in valeurs)
        {
            Console.Write($"{val} ");
        }
        Console.WriteLine();
        
        // Equals() - Vérifier l'égalité
        bool egal = vrai.Equals(true);
        Console.WriteLine($"Égalité: {egal}"); // True
        
        bool different = faux.Equals(true);
        Console.WriteLine($"Différent: {different}"); // False
        
        // Cas d'usage : système de permissions
        bool estAdministrateur = true;
        bool estConnecte = true;
        bool aAccesFichier = false;
        
        Console.WriteLine("Vérification des permissions:");
        
        if (estConnecte.Equals(true))
        {
            Console.WriteLine("✓ Utilisateur connecté");
            
            if (estAdministrateur.Equals(true))
            {
                Console.WriteLine("✓ Droits administrateur");
                Console.WriteLine("→ Accès total autorisé");
            }
            else if (aAccesFichier.Equals(true))
            {
                Console.WriteLine("✓ Accès fichier autorisé");
                Console.WriteLine("→ Accès limité aux fichiers");
            }
            else
            {
                Console.WriteLine("✗ Aucun droit spécial");
                Console.WriteLine("→ Accès de base seulement");
            }
        }
        else
        {
            Console.WriteLine("✗ Utilisateur non connecté");
            Console.WriteLine("→ Accès refusé");
        }
        
        // Cas d'usage pratique : validation de formulaire
        bool nomValide = true;
        bool emailValide = false;
        bool ageValide = true;
        bool conditionsAcceptees = false;
        
        Console.WriteLine("\nValidation du formulaire:");
        Console.WriteLine($"Nom valide: {nomValide}");
        Console.WriteLine($"Email valide: {emailValide}");
        Console.WriteLine($"Âge valide: {ageValide}");
        Console.WriteLine($"Conditions acceptées: {conditionsAcceptees}");
        
        bool formulaireValide = nomValide && emailValide && ageValide && conditionsAcceptees;
        Console.WriteLine($"Formulaire complet: {formulaireValide}");
        
        if (formulaireValide.Equals(false))
        {
            Console.WriteLine("Erreurs à corriger:");
            if (!nomValide) Console.WriteLine("- Nom invalide");
            if (!emailValide) Console.WriteLine("- Email invalide");
            if (!ageValide) Console.WriteLine("- Âge invalide");
            if (!conditionsAcceptees) Console.WriteLine("- Conditions non acceptées");
        }
        
        // Cas d'usage : système de configuration
        bool[] parametres = new bool[5];
        string[] descriptions = {
            "Notifications activées",
            "Mode sombre",
            "Sauvegarde automatique",
            "Sons activés",
            "Mise à jour automatique"
        };
        
        // Simuler quelques paramètres activés
        parametres[0] = true;  // Notifications
        parametres[2] = true;  // Sauvegarde auto
        parametres[4] = false; // Pas de MAJ auto
        
        Console.WriteLine("\nConfiguration actuelle:");
        for (int i = 0; i < parametres.Length; i++)
        {
            string statut = parametres[i].ToString();
            string icone = parametres[i] ? "✓" : "✗";
            Console.WriteLine($"{icone} {descriptions[i]}: {statut}");
        }
        
        // Compter les fonctionnalités activées
        int fonctionnalitesActivees = 0;
        foreach (bool parametre in parametres)
        {
            if (parametre.Equals(true))
            {
                fonctionnalitesActivees++;
            }
        }
        
        Console.WriteLine($"Fonctionnalités activées: {fonctionnalitesActivees}/{parametres.Length}");
        
        // Cas d'usage : système de validation en chaîne
        bool etape1Complete = true;
        bool etape2Complete = true;
        bool etape3Complete = false;
        bool etape4Complete = false;
        
        Console.WriteLine("\nProcessus de validation:");
        
        if (etape1Complete)
        {
            Console.WriteLine("Étape 1: ✓ Complète");
            
            if (etape2Complete)
            {
                Console.WriteLine("Étape 2: ✓ Complète");
                
                if (etape3Complete)
                {
                    Console.WriteLine("Étape 3: ✓ Complète");
                    
                    if (etape4Complete)
                    {
                        Console.WriteLine("Étape 4: ✓ Complète");
                        Console.WriteLine("→ Processus entièrement terminé!");
                    }
                    else
                    {
                        Console.WriteLine("Étape 4: ✗ En attente");
                        Console.WriteLine("→ Processus en cours...");
                    }
                }
                else
                {
                    Console.WriteLine("Étape 3: ✗ En attente");
                    Console.WriteLine("→ Arrêt à l'étape 3");
                }
            }
            else
            {
                Console.WriteLine("Étape 2: ✗ En attente");
                Console.WriteLine("→ Arrêt à l'étape 2");
            }
        }
        else
        {
            Console.WriteLine("Étape 1: ✗ En attente");
            Console.WriteLine("→ Le processus ne peut pas commencer");
        }
    }
}

5. Type char

Le type char représente un caractère Unicode et possède des méthodes utiles pour la manipulation des caractères.

Tableau des méthodes principales

MéthodeSignatureDescription
ToString()string ToString()Convertit le caractère en chaîne
IsLetter()static bool IsLetter(char c)Vérifie si c'est une lettre
IsDigit()static bool IsDigit(char c)Vérifie si c'est un chiffre
IsWhiteSpace()static bool IsWhiteSpace(char c)Vérifie si c'est un espace
IsUpper()static bool IsUpper(char c)Vérifie si c'est une majuscule
IsLower()static bool IsLower(char c)Vérifie si c'est une minuscule
ToUpper()static char ToUpper(char c)Convertit en majuscule
ToLower()static char ToLower(char c)Convertit en minuscule
CompareTo()int CompareTo(char value)Compare deux caractères

Exemples pratiques

csharp
using System;

class Program
{
    static void Main()
    {
        char lettre = 'A';
        char chiffre = '5';
        char espace = ' ';
        char minuscule = 'b';
        char caractereSpecial = '@';
        
        // ToString() - Convertir en chaîne
        Console.WriteLine($"Lettre en texte: '{lettre.ToString()}'"); // "A"
        
        // Cas d'usage : construire une chaîne caractère par caractère
        char[] caracteres = {'H', 'e', 'l', 'l', 'o'};
        string motConstruit = "";
        foreach (char c in caracteres)
        {
            motConstruit += c.ToString();
        }
        Console.WriteLine($"Mot construit: {motConstruit}");
        
        // IsLetter() - Vérifier si c'est une lettre
        Console.WriteLine($"'{lettre}' est une lettre: {char.IsLetter(lettre)}"); // True
        Console.WriteLine($"'{chiffre}' est une lettre: {char.IsLetter(chiffre)}"); // False
        Console.WriteLine($"'{caractereSpecial}' est une lettre: {char.IsLetter(caractereSpecial)}"); // False
        
        // IsDigit() - Vérifier si c'est un chiffre
        Console.WriteLine($"'{chiffre}' est un chiffre: {char.IsDigit(chiffre)}"); // True
        Console.WriteLine($"'{lettre}' est un chiffre: {char.IsDigit(lettre)}"); // False
        
        // Cas d'usage : extraire les chiffres d'une chaîne
        string texteAvecChiffres = "Mon code est ABC123XYZ789";
        string chiffresExtraits = "";
        foreach (char c in texteAvecChiffres)
        {
            if (char.IsDigit(c))
            {
                chiffresExtraits += c;
            }
        }
        Console.WriteLine($"Chiffres extraits: {chiffresExtraits}"); // "123789"
        
        // IsWhiteSpace() - Vérifier si c'est un espace
        Console.WriteLine($"Espace détecté: {char.IsWhiteSpace(espace)}"); // True
        Console.WriteLine($"Tab détecté: {char.IsWhiteSpace('\t')}"); // True
        Console.WriteLine($"Nouvelle ligne détectée: {char.IsWhiteSpace('\n')}"); // True
        
        // Cas d'usage : compter les espaces dans un texte
        string phrase = "Bonjour tout le monde!";
        int nombreEspaces = 0;
        foreach (char c in phrase)
        {
            if (char.IsWhiteSpace(c))
            {
                nombreEspaces++;
            }
        }
        Console.WriteLine($"Nombre d'espaces dans '{phrase}': {nombreEspaces}");
        
        // IsUpper() et IsLower() - Vérifier la casse
        Console.WriteLine($"'{lettre}' est majuscule: {char.IsUpper(lettre)}"); // True
        Console.WriteLine($"'{minuscule}' est minuscule: {char.IsLower(minuscule)}"); // True
        
        // Cas d'usage : analyser la casse d'un mot de passe
        string motDePasse = "MonMotDePasse123!";
        bool aMajuscule = false;
        bool aMinuscule = false;
        bool aChiffre = false;
        bool aSpecial = false;
        
        foreach (char c in motDePasse)
        {
            if (char.IsUpper(c)) aMajuscule = true;
            else if (char.IsLower(c)) aMinuscule = true;
            else if (char.IsDigit(c)) aChiffre = true;
            else if (!char.IsWhiteSpace(c)) aSpecial = true;
        }
        
        Console.WriteLine($"Analyse du mot de passe '{motDePasse}':");
        Console.WriteLine($"  Majuscules: {aMajuscule}");
        Console.WriteLine($"  Minuscules: {aMinuscule}");
        Console.WriteLine($"  Chiffres: {aChiffre}");
        Console.WriteLine($"  Caractères spéciaux: {aSpecial}");
        
        int criteres = (aMajuscule ? 1 : 0) + (aMinuscule ? 1 : 0) + (aChiffre ? 1 : 0) + (aSpecial ? 1 : 0);
        Console.WriteLine($"  Force: {criteres}/4 critères respectés");
        
        // ToUpper() et ToLower() - Changer la casse
        char majuscule = char.ToUpper(minuscule);
        char nouveauMinuscule = char.ToLower(lettre);
        Console.WriteLine($"'{minuscule}' en majuscule: '{majuscule}'"); // 'B'
        Console.WriteLine($"'{lettre}' en minuscule: '{nouveauMinuscule}'"); // 'a'
        
        // Cas d'usage : normaliser la casse d'une chaîne
        string entreeUtilisateur = "hElLo WoRlD";
        string normalise = "";
        foreach (char c in entreeUtilisateur)
        {
            normalise += char.ToLower(c);
        }
        Console.WriteLine($"Entrée normalisée: '{normalise}'");
        
        // Cas d'usage : créer un titre avec première lettre majuscule
        string[] mots = {"bonjour", "tout", "le", "monde"};
        string titre = "";
        foreach (string mot in mots)
        {
            if (mot.Length > 0)
            {
                string motFormate = char.ToUpper(mot[0]) + mot.Substring(1).ToLower();
                titre += motFormate + " ";
            }
        }
        Console.WriteLine($"Titre formaté: '{titre.Trim()}'"); // "Bonjour Tout Le Monde"
        
        // CompareTo() - Comparer (ordre ASCII)
        int comparaison = lettre.CompareTo(minuscule);
        Console.WriteLine($"'{lettre}' comparé à '{minuscule}': {comparaison}"); // -33 (A < b en ASCII)
        
        char a1 = 'A';
        char a2 = 'B';
        char a3 = 'a';
        
        Console.WriteLine($"'{a1}' comparé à '{a2}': {a1.CompareTo(a2)}"); // -1 (A < B)
        Console.WriteLine($"'{a2}' comparé à '{a1}': {a2.CompareTo(a1)}"); // 1 (B > A)
        Console.WriteLine($"'{a1}' comparé à '{a3}': {a1.CompareTo(a3)}"); // -32 (A < a)
        
        // Cas d'usage : tri de caractères
        char[] caracteresTri = {'z', 'A', 'm', 'B', 'c'};
        Console.WriteLine("Avant tri:");
        foreach (char c in caracteresTri)
        {
            Console.Write($"{c} ");
        }
        Console.WriteLine();
        
        Array.Sort(caracteresTri); // Utilise CompareTo
        Console.WriteLine("Après tri (ASCII):");
        foreach (char c in caracteresTri)
        {
            Console.Write($"{c} ");
        }
        Console.WriteLine();
        
        // IsLetterOrDigit() - Combiner les vérifications
        string chaineComplexe = "Abc123!@#";
        Console.WriteLine($"Analyse de '{chaineComplexe}':");
        foreach (char c in chaineComplexe)
        {
            if (char.IsLetterOrDigit(c))
            {
                Console.WriteLine($"  '{c}' est alphanumérique");
            }
            else
            {
                Console.WriteLine($"  '{c}' est un caractère spécial");
            }
        }
        
        // IsPunctuation() - Vérifier la ponctuation
        string texteAvecPonctuation = "Bonjour, comment allez-vous?";
        int nombrePonctuations = 0;
        foreach (char c in texteAvecPonctuation)
        {
            if (char.IsPunctuation(c))
            {
                nombrePonctuations++;
                Console.WriteLine($"Ponctuation trouvée: '{c}'");
            }
        }
        Console.WriteLine($"Nombre total de ponctuations: {nombrePonctuations}");
        
        // IsSymbol() - Vérifier les symboles
        string texteAvecSymboles = "Prix: 50€ + 10% = 55€";
        foreach (char c in texteAvecSymboles)
        {
            if (char.IsSymbol(c))
            {
                Console.WriteLine($"Symbole trouvé: '{c}'");
            }
        }
        
        // Exemple pratique : analyser une chaîne complète
        string texte = "Hello World 123! @#$";
        int lettres = 0, chiffres = 0, espaces = 0, ponctuation = 0, symboles = 0, autres = 0;
        
        foreach (char c in texte)
        {
            if (char.IsLetter(c)) lettres++;
            else if (char.IsDigit(c)) chiffres++;
            else if (char.IsWhiteSpace(c)) espaces++;
            else if (char.IsPunctuation(c)) ponctuation++;
            else if (char.IsSymbol(c)) symboles++;
            else autres++;
        }
        
        Console.WriteLine($"\nAnalyse complète de '{texte}':");
        Console.WriteLine($"  Lettres: {lettres}");
        Console.WriteLine($"  Chiffres: {chiffres}");
        Console.WriteLine($"  Espaces: {espaces}");
        Console.WriteLine($"  Ponctuation: {ponctuation}");
        Console.WriteLine($"  Symboles: {symboles}");
        Console.WriteLine($"  Autres: {autres}");
        Console.WriteLine($"  Total: {texte.Length} caractères");
        
        // Cas d'usage : valider un nom d'utilisateur
        string[] nomsUtilisateurs = {"Alice123", "Bob_Smith", "Charlie!", "user@domain", "valid_user"};
        
        foreach (string nom in nomsUtilisateurs)
        {
            bool estValide = true;
            string raison = "";
            
            // Règles: seulement lettres, chiffres et underscore
            foreach (char c in nom)
            {
                if (!char.IsLetterOrDigit(c) && c != '_')
                {
                    estValide = false;
                    raison = $"Caractère invalide: '{c}'";
                    break;
                }
            }
            
            if (estValide && nom.Length < 3)
            {
                estValide = false;
                raison = "Trop court (minimum 3 caractères)";
            }
            
            if (estValide && char.IsDigit(nom[0]))
            {
                estValide = false;
                raison = "Ne peut pas commencer par un chiffre";
            }
            
            Console.WriteLine($"Nom d'utilisateur '{nom}': {(estValide ? "✓ Valide" : "✗ Invalide - " + raison)}");
        }
        
        // Exemple : générer un mot de passe aléatoire
        Random random = new Random();
        string motDePasseGenere = "";
        string caracteresPossibles = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%";
        
        for (int i = 0; i < 12; i++) // Mot de passe de 12 caractères
        {
            int index = random.Next(caracteresPossibles.Length);
            motDePasseGenere += caracteresPossibles[index];
        }
        
        Console.WriteLine($"\nMot de passe généré: {motDePasseGenere}");
        
        // Vérifier qu'il respecte les critères
        bool genereMajuscule = false, genereMinuscule = false, genereChiffre = false, genereSpecial = false;
        foreach (char c in motDePasseGenere)
        {
            if (char.IsUpper(c)) genereMajuscule = true;
            else if (char.IsLower(c)) genereMinuscule = true;
            else if (char.IsDigit(c)) genereChiffre = true;
            else genereSpecial = true;
        }
        
        Console.WriteLine("Vérification du mot de passe généré:");
        Console.WriteLine($"  ✓ Longueur suffisante: {motDePasseGenere.Length >= 8}");
        Console.WriteLine($"  {(genereMajuscule ? "✓" : "✗")} Contient majuscules: {genereMajuscule}");
        Console.WriteLine($"  {(genereMinuscule ? "✓" : "✗")} Contient minuscules: {genereMinuscule}");
        Console.WriteLine($"  {(genereChiffre ? "✓" : "✗")} Contient chiffres: {genereChiffre}");
        Console.WriteLine($"  {(genereSpecial ? "✓" : "✗")} Contient caractères spéciaux: {genereSpecial}");
    }
}

6. Type DateTime

Le type DateTime est très riche en méthodes pour manipuler les dates et heures.

Tableau des méthodes principales

MéthodeSignatureDescription
Nowstatic DateTime Now { get; }Date et heure actuelles
Todaystatic DateTime Today { get; }Date d'aujourd'hui (minuit)
ToString()string ToString()Convertit en chaîne
AddDays()DateTime AddDays(double value)Ajoute des jours
AddHours()DateTime AddHours(double value)Ajoute des heures
AddMinutes()DateTime AddMinutes(double value)Ajoute des minutes
AddYears()DateTime AddYears(int value)Ajoute des années
Subtract()TimeSpan Subtract(DateTime value)Calcule la différence
CompareTo()int CompareTo(DateTime value)Compare deux dates
Parse()static DateTime Parse(string s)Convertit une chaîne en DateTime
Yearint Year { get; }Année
Monthint Month { get; }Mois
Dayint Day { get; }Jour
Hourint Hour { get; }Heure
Minuteint Minute { get; }Minute
Secondint Second { get; }Seconde

Exemples pratiques

csharp
using System;

class Program
{
    static void Main()
    {
        // Now et Today - Obtenir la date/heure actuelle
        DateTime maintenant = DateTime.Now;
        DateTime aujourdhui = DateTime.Today;
        
        Console.WriteLine($"Maintenant: {maintenant}");
        Console.WriteLine($"Aujourd'hui: {aujourdhui}");
        
        // Propriétés de date
        Console.WriteLine($"Année: {maintenant.Year}");
        Console.WriteLine($"Mois: {maintenant.Month}");
        Console.WriteLine($"Jour: {maintenant.Day}");
        Console.WriteLine($"Heure: {maintenant.Hour}");
        Console.WriteLine($"Minute: {maintenant.Minute}");
        Console.WriteLine($"Seconde: {maintenant.Second}");
        Console.WriteLine($"Jour de la semaine: {maintenant.DayOfWeek}");
        Console.WriteLine($"Jour de l'année: {maintenant.DayOfYear}");
        
        // Cas d'usage : afficher la date en français
        string[] joursEnFrancais = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
        string[] moisEnFrancais = {"", "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", 
                                  "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"};
        
        string jourFrancais = joursEnFrancais[(int)maintenant.DayOfWeek];
        string moisFrancais = moisEnFrancais[maintenant.Month];
        Console.WriteLine($"Aujourd'hui c'est {jourFrancais} {maintenant.Day} {moisFrancais} {maintenant.Year}");
        
        // ToString() - Formatage
        Console.WriteLine($"Format par défaut: {maintenant.ToString()}");
        Console.WriteLine($"Date courte: {maintenant.ToString("d")}");
        Console.WriteLine($"Heure courte: {maintenant.ToString("t")}");
        Console.WriteLine($"Date longue: {maintenant.ToString("D")}");
        Console.WriteLine($"Heure longue: {maintenant.ToString("T")}");
        Console.WriteLine($"Format complet: {maintenant.ToString("F")}");
        Console.WriteLine($"Format personnalisé: {maintenant.ToString("dd/MM/yyyy HH:mm")}");
        Console.WriteLine($"Format international: {maintenant.ToString("yyyy-MM-dd HH:mm:ss")}");
        
        // Cas d'usage : formats pour différents contextes
        Console.WriteLine("\nFormats pour différents usages:");
        Console.WriteLine($"Nom de fichier: {maintenant.ToString("yyyyMMdd_HHmmss")}");
        Console.WriteLine($"Format email: {maintenant.ToString("ddd, dd MMM yyyy HH:mm:ss")}");
        Console.WriteLine($"Format pour base de données: {maintenant.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
        
        // Add methods - Ajouter du temps
        DateTime demain = maintenant.AddDays(1);
        DateTime dansUneHeure = maintenant.AddHours(1);
        DateTime lAnneeProchaine = maintenant.AddYears(1);
        DateTime laSemaineProchaine = maintenant.AddDays(7);
        DateTime leMoisProchain = maintenant.AddMonths(1);
        DateTime dansUneMinute = maintenant.AddMinutes(1);
        DateTime dansUneSeconde = maintenant.AddSeconds(1);
        
        Console.WriteLine($"\nCalculs de dates:");
        Console.WriteLine($"Demain: {demain.ToString("d")}");
        Console.WriteLine($"Dans une heure: {dansUneHeure.ToString("t")}");
        Console.WriteLine($"L'année prochaine: {lAnneeProchaine.ToString("d")}");
        Console.WriteLine($"La semaine prochaine: {laSemaineProchaine.ToString("d")}");
        Console.WriteLine($"Le mois prochain: {leMoisProchain.ToString("d")}");
        
        // Cas d'usage : calculer des échéances
        DateTime dateAchat = new DateTime(2024, 1, 15);
        DateTime garantieExpire = dateAchat.AddYears(2);
        DateTime rappelGarantie = garantieExpire.AddMonths(-1); // Un mois avant
        
        Console.WriteLine($"\nGestion de garantie:");
        Console.WriteLine($"Date d'achat: {dateAchat.ToString("d")}");
        Console.WriteLine($"Garantie expire le: {garantieExpire.ToString("d")}");
        Console.WriteLine($"Rappel programmé le: {rappelGarantie.ToString("d")}");
        
        // Subtract() - Calculer des différences
        DateTime anniversaire = new DateTime(2000, 6, 15);
        TimeSpan age = maintenant.Subtract(anniversaire);
        Console.WriteLine($"\nCalcul d'âge:");
        Console.WriteLine($"Anniversaire: {anniversaire.ToString("d")}");
        Console.WriteLine($"Jours depuis le 15/06/2000: {age.Days}");
        Console.WriteLine($"Années approximatives: {age.Days / 365.25:F1}");
        Console.WriteLine($"Heures totales: {age.TotalHours:F0}");
        Console.WriteLine($"Minutes totales: {age.TotalMinutes:F0}");
        
        // Cas d'usage : calculer le temps de travail
        DateTime debutTravail = new DateTime(2024, 1, 1, 9, 0, 0);
        DateTime finTravail = new DateTime(2024, 1, 1, 17, 30, 0);
        TimeSpan dureeeTravail = finTravail.Subtract(debutTravail);
        
        Console.WriteLine($"\nJournée de travail:");
        Console.WriteLine($"Début: {debutTravail.ToString("HH:mm")}");
        Console.WriteLine($"Fin: {finTravail.ToString("HH:mm")}");
        Console.WriteLine($"Durée: {dureeeTravail.Hours}h {dureeeTravail.Minutes}min");
        Console.WriteLine($"Total en heures: {dureeeTravail.TotalHours:F2}h");
        
        // CompareTo() - Comparer des dates
        DateTime dateA = new DateTime(2023, 1, 1);
        DateTime dateB = new DateTime(2023, 12, 31);
        DateTime dateC = new DateTime(2023, 1, 1);
        
        int comparaison = dateA.CompareTo(dateB);
        Console.WriteLine($"\nComparaisons:");
        Console.WriteLine($"01/01/2023 comparé à 31/12/2023: {comparaison}"); // -1 (antérieur)
        Console.WriteLine($"31/12/2023 comparé à 01/01/2023: {dateB.CompareTo(dateA)}"); // 1 (postérieur)
        Console.WriteLine($"01/01/2023 comparé à 01/01/2023: {dateA.CompareTo(dateC)}"); // 0 (égal)
        
        // Cas d'usage : trier des dates
        DateTime[] dates = {
            new DateTime(2023, 5, 15),
            new DateTime(2023, 1, 10),
            new DateTime(2023, 12, 25),
            new DateTime(2023, 3, 8)
        };
        
        Console.WriteLine("Dates avant tri:");
        foreach (DateTime date in dates)
        {
            Console.WriteLine($"  {date.ToString("d")}");
        }
        
        Array.Sort(dates); // Utilise CompareTo
        Console.WriteLine("Dates après tri:");
        foreach (DateTime date in dates)
        {
            Console.WriteLine($"  {date.ToString("d")}");
        }
        
        // Parse() - Convertir depuis une chaîne
        DateTime dateParsee = DateTime.Parse("25/12/2023");
        Console.WriteLine($"\nDate parsée: {dateParsee.ToString("d")}");
        
        // TryParse pour éviter les erreurs
        string[] datesTexte = {"25/12/2023", "2023-12-25", "invalid date", "01/01/2025"};
        foreach (string dateTexte in datesTexte)
        {
            if (DateTime.TryParse(dateTexte, out DateTime dateConvertie))
            {
                Console.WriteLine($"'{dateTexte}' → {dateConvertie.ToString("d")}");
            }
            else
            {
                Console.WriteLine($"'{dateTexte}' → Format invalide");
            }
        }
        
        // Exemple pratique : calculer l'âge exact
        DateTime dateNaissance = new DateTime(1995, 3, 20);
        int ageEnAnnees = DateTime.Today.Year - dateNaissance.Year;
        
        // Ajuster si l'anniversaire n'a pas encore eu lieu cette année
        if (DateTime.Today < dateNaissance.AddYears(ageEnAnnees))
        {
            ageEnAnnees--;
        }
        
        Console.WriteLine($"\nCalcul d'âge précis:");
        Console.WriteLine($"Date de naissance: {dateNaissance.ToString("d")}");
        Console.WriteLine($"Âge calculé: {ageEnAnnees} ans");
        
        // Calculer l'âge en années, mois et jours
        DateTime prochainniversaire = dateNaissance.AddYears(ageEnAnnees + 1);
        DateTime dernierAnniversaire = dateNaissance.AddYears(ageEnAnnees);
        
        int moisDepuisAnniversaire = DateTime.Today.Month - dernierAnniversaire.Month;
        int joursDepuisAnniversaire = DateTime.Today.Day - dernierAnniversaire.Day;
        
        if (joursDepuisAnniversaire < 0)
        {
            moisDepuisAnniversaire--;
            DateTime dernierMois = DateTime.Today.AddMonths(-1);
            joursDepuisAnniversaire += DateTime.DaysInMonth(dernierMois.Year, dernierMois.Month);
        }
        
        if (moisDepuisAnniversaire < 0)
        {
            moisDepuisAnniversaire += 12;
        }
        
        Console.WriteLine($"Âge détaillé: {ageEnAnnees} ans, {moisDepuisAnniversaire} mois, {joursDepuisAnniversaire} jours");
        
        TimeSpan tempsAvantAnniversaire = prochainniversaire.Subtract(DateTime.Today);
        Console.WriteLine($"Jours avant le prochain anniversaire: {tempsAvantAnniversaire.Days}");
        
        // Cas d'usage : planificateur d'événements
        DateTime[] evenements = {
            new DateTime(2024, 12, 25), // Noël
            new DateTime(2024, 7, 14),  // Fête nationale
            new DateTime(2024, 1, 1),   // Nouvel an
            new DateTime(2024, 5, 1)    // Fête du travail
        };
        
        string[] nomsEvenements = {"Noël", "Fête nationale", "Nouvel an", "Fête du travail"};
        
        Console.WriteLine("\nProchainsevénements:");
        for (int i = 0; i < evenements.Length; i++)
        {
            TimeSpan tempsAvantEvenement = evenements[i].Subtract(DateTime.Today);
            
            if (tempsAvantEvenement.Days >= 0)
            {
                Console.WriteLine($"{nomsEvenements[i]}: dans {tempsAvantEvenement.Days} jours ({evenements[i].ToString("d")})");
            }
            else
            {
                Console.WriteLine($"{nomsEvenements[i]}: passé il y a {Math.Abs(tempsAvantEvenement.Days)} jours");
            }
        }
        
        // Cas d'usage : vérifier les jours ouvrables
        DateTime dateTest = DateTime.Today;
        for (int i = 0; i < 7; i++)
        {
            DateTime jourTest = dateTest.AddDays(i);
            bool estJourOuvrable = jourTest.DayOfWeek != DayOfWeek.Saturday && 
                                  jourTest.DayOfWeek != DayOfWeek.Sunday;
            
            string typeJour = estJourOuvrable ? "jour ouvrable" : "week-end";
            Console.WriteLine($"{jourTest.ToString("ddd dd/MM")}: {typeJour}");
        }
        
        // Cas d'usage : calculer des délais de livraison
        DateTime dateCommande = DateTime.Today;
        DateTime livraisonStandard = dateCommande.AddDays(5);
        DateTime livraisonExpress = dateCommande.AddDays(2);
        DateTime livraisonUrgente = dateCommande.AddHours(24);
        
        Console.WriteLine($"\nDélais de livraison pour commande du {dateCommande.ToString("d")}:");
        Console.WriteLine($"Livraison standard: {livraisonStandard.ToString("d")}");
        Console.WriteLine($"Livraison express: {livraisonExpress.ToString("d")}");
        Console.WriteLine($"Livraison urgente: {livraisonUrgente.ToString("dd/MM à HH:mm")}");
        
        // Exemple : système de réservation
        DateTime[] creneauxDisponibles = {
            new DateTime(2024, 10, 5, 9, 0, 0),
            new DateTime(2024, 10, 5, 11, 0, 0),
            new DateTime(2024, 10, 5, 14, 0, 0),
            new DateTime(2024, 10, 5, 16, 0, 0)
        };
        
        Console.WriteLine("\nCréneaux de réservation disponibles:");
        foreach (DateTime creneau in creneauxDisponibles)
        {
            DateTime finCreneau = creneau.AddHours(1.5); // Séance de 1h30
            Console.WriteLine($"De {creneau.ToString("HH:mm")} à {finCreneau.ToString("HH:mm")}");
        }
        
        // Vérifier si un créneau est dans les heures d'ouverture
        TimeSpan ouverture = new TimeSpan(8, 0, 0);  // 8h00
        TimeSpan fermeture = new TimeSpan(18, 0, 0); // 18h00
        
        foreach (DateTime creneau in creneauxDisponibles)
        {
            TimeSpan heureCreneau = creneau.TimeOfDay;
            bool estOuvert = heureCreneau >= ouverture && heureCreneau <= fermeture;
            Console.WriteLine($"Créneau {creneau.ToString("HH:mm")}: {(estOuvert ? "✓ Disponible" : "✗ Fermé")}");
        }
    }
}

Conclusion

Les méthodes des types natifs de C# sont des outils puissants qui simplifient grandement la programmation. Elles permettent de :

  • Manipuler et formater les chaînes de caractères efficacement
  • Convertir entre différents types de données de manière sécurisée
  • Effectuer des opérations sur les dates et heures
  • Valider et analyser les données d'entrée

La maîtrise de ces méthodes est essentielle pour écrire du code C# efficace et robuste. N'hésitez pas à consulter la documentation officielle de Microsoft pour découvrir d'autres méthodes et leurs surcharges.

Syllabus créé par Prof. Frédéric Pluquet