Le modificateur const peut être appliqué (et devrait généralement l'être) à tout champ dont la valeur est connue à la compilation et ne change pas pendant toute la durée de vie du programme.
private const int num = 1729;
public const string title = "Grand" + " Master";
Le modificateur readonly peut être appliqué (et devrait généralement l'être) à tout champ qui ne peut pas être déclaré const, dont la valeur ne change pas pendant toute la durée de vie du programme et qui est initialisé soit par un initialiseur en ligne, soit au moment de l'instanciation (par le constructeur ou par une méthode appelée par le constructeur).
private readonly int num;
private readonly System.Random rand = new System.Random();
public MyClass(int num)
{
this.num = num;
}
Dans les situations sensibles du point de vue de la sécurité (ou même simplement dans une grande base de code où les développeurs ont des priorités et des objectifs différents), il faut éviter de laisser contourner l'API publique d'une classe en acceptant et en stockant les paramètres mutables d'une méthode, ou en exposant un membre mutable d'une classe via une valeur de retour ou un paramètre out.
Le modificateur readonly empêche que la valeur ou la référence d'un champ soit écrasée, mais il n'offre aucune protection pour les membres d'un type référence.
readonly List<int> ints = new List<int>();
void Foo()
{
ints.Add(1); // ok
ints = new List<int>(); // fails to compile
}
Pour garantir que tous les membres d'un type référence sont protégés, on peut rendre les champs readonly et définir des propriétés automatiques sans accesseur set.
La Base Class Library (BCL) fournit des versions en lecture seule de certaines collections lorsqu'il faut empêcher la modification des membres d'une collection. Elles se présentent sous forme de wrappers :
ReadOnlyDictionary<T> expose un Dictionary<T> en lecture seule.ReadOnlyCollection<T> expose un List<T> en lecture seule.Le système d'authentification que tu as vu pour la dernière fois dans developer-privileges a besoin d'un peu d'attention. On t'a chargé de nettoyer le code. Un tel projet de nettoyage ne facilitera pas seulement la vie des futurs mainteneurs, il mettra aussi au jour et corrigera quelques vulnérabilités de sécurité.
const
C'est une tâche de réécriture. Ajoute le modificateur const à tous les membres de Authenticator ou Identity que tu juges appropriés.
readonly
C'est une tâche de réécriture. Ajoute le modificateur readonly à tous les champs de la classe Authenticator ou de la structure Identity que tu juges appropriés.
Supprime l'accesseur set ou rends-le private pour toute propriété appropriée de la classe Authenticator ou de la structure Identity.
Pour l'instant, le champ d'identité admin est renvoyé par un appel à Admin. Ce n'est pas idéal, car l'appelant peut modifier ce champ. Trouve un moyen d'empêcher l'appelant de modifier les détails de l'admin sur l'objet Authenticator.
Pour l'instant, le dictionnaire qui contient les identités de développeurs privilégiés « en dur » est renvoyé par un appel à GetDevelopers(). Ce n'est pas idéal, car l'appelant peut modifier ce dictionnaire. Trouve un moyen d'empêcher l'appelant de modifier les détails des développeurs sur l'objet Authenticator.
Inscris-toi sur Exercism pour apprendre et maîtriser C# avec 62 concepts178 exercices, et un vrai mentorat humain, le tout gratuitement.