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.
Défi
FacileConstruisons 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 classeServerConfigdans l'espace de nomsSettingsqui 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
Portavec un setter privé (définie via le constructeur) - Une propriété en écriture seule
ApiKeyqui stocke une clé secrète en interne - Une méthode
ValidateApiKey(string key)qui retournetruesi la clé fournie correspond à celle stockée - Un constructeur qui accepte le nom du serveur et le port
- Une propriété en lecture seule
Program.cs: Dans votre fichier principal, créez un objetServerConfigen 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: TrueAide-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}
}
}
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
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et Utilisateur