Menu
Coddy logo textTech

Propriétés en lecture/écriture seule

Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy — leçon 11 sur 70.

Parfois, vous avez besoin de propriétés qui ne peuvent être que lues ou seulement écrites. Vous pouvez contrôler cela en utilisant private sur des accesseurs individuels.

Une propriété en lecture seule possède un getter public mais un setter privé (ou aucun setter du tout) :

public class User
{
    public string Username { get; private set; }
    
    public User(string username)
    {
        Username = username;
    }
}

Le code externe peut lire Username, mais seule la classe elle-même peut le modifier. Ceci est utile pour les valeurs qui doivent être définies une seule fois lors de la construction.

Une propriété en écriture seule a un setter public mais un getter privé :

public class Account
{
    public string Password { private get; set; }
    
    public bool ValidatePassword(string input)
    {
        return input == Password;
    }
}

Les propriétés en écriture seule sont rares mais utiles pour les données sensibles comme les mots de passe, pour lesquelles vous souhaitez accepter une saisie sans exposer la valeur stockée.

Vous pouvez également créer des propriétés véritablement en lecture seule avec seulement un accesseur (getter) :

public class Circle
{
    public double Radius { get; }
    public double Area => Math.PI * Radius * Radius;
    
    public Circle(double radius)
    {
        Radius = radius;
    }
}

Les propriétés avec seulement get; ne peuvent être assignées que dans le constructeur ou lors de la déclaration, ce qui les rend immuables après la création de l'objet.

challenge icon

Défi

Facile

Construisons un système de configuration sécurisé qui démontre quand utiliser des propriétés en lecture seule et en écriture seule pour protéger les données sensibles.

Vous allez créer deux fichiers pour organiser votre code :

  • Config.cs : Définissez une classe ServerConfig dans l'espace de noms Settings qui gère la configuration du serveur. Elle doit comporter :
    • Une propriété en lecture seule ServerName (ne peut être définie que dans le constructeur)
    • Une propriété en lecture seule Port avec un setter privé (définie via le constructeur)
    • Une propriété en écriture seule ApiKey qui stocke une clé secrète en interne
    • Une méthode ValidateApiKey(string key) qui retourne true si la clé fournie correspond à celle stockée
    • Un constructeur qui accepte le nom du serveur et le port
  • Program.cs : Dans votre fichier principal, créez un objet ServerConfig en utilisant les valeurs d'entrée, définissez la clé API, puis validez-la par rapport à une clé de test.

Vous recevrez quatre entrées :

  • Nom du serveur
  • Numéro de port
  • Clé API à stocker
  • Clé API à valider

Affichez les détails du serveur et le résultat de la validation dans ce format :

Server: {ServerName}, Port: {Port}
API Key Valid: {True/False}

Par exemple, si les entrées sont MainServer, 8080, secret123, et secret123, la sortie doit être :

Server: MainServer, Port: 8080
API Key Valid: True

Aide-mémoire

Vous pouvez contrôler l'accès aux propriétés en utilisant private sur des accesseurs individuels.

Propriété en lecture seule avec un setter privé :

public class User
{
    public string Username { get; private set; }
    
    public User(string username)
    {
        Username = username;
    }
}

Le code externe peut lire Username, mais seule la classe elle-même peut le modifier.

Propriété en écriture seule avec un getter privé :

public class Account
{
    public string Password { private get; set; }
    
    public bool ValidatePassword(string input)
    {
        return input == Password;
    }
}

Utile pour les données sensibles où vous souhaitez accepter une entrée sans exposer la valeur stockée.

Propriété véritablement en lecture seule avec uniquement un getter :

public class Circle
{
    public double Radius { get; }
    
    public Circle(double radius)
    {
        Radius = radius;
    }
}

Les propriétés avec seulement get; ne peuvent être assignées que dans le constructeur ou lors de la déclaration, ce qui les rend immuables après la création de l'objet.

Essayez vous-même

using System;
using Settings;

class Program
{
    public static void Main(string[] args)
    {
        // Lire les entrées
        string serverName = Console.ReadLine();
        int port = Convert.ToInt32(Console.ReadLine());
        string apiKeyToStore = Console.ReadLine();
        string apiKeyToValidate = Console.ReadLine();

        // TODO: Créer un objet ServerConfig avec serverName et port

        // TODO: Définir la clé API en utilisant la propriété en écriture seule (write-only)

        // TODO: Valider la clé API et afficher les résultats
        // Format: Server: {ServerName}, Port: {Port}
        //         API Key Valid: {True/False}
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet