“Const correctitude” en C #

Le sharepoint const-correct est de pouvoir fournir une vue d’une instance qui ne peut pas être modifiée ou supprimée par l’utilisateur. Le compilateur prend cela en charge en signalant lorsque vous interrompez la constance depuis une fonction const ou essayez d’utiliser une fonction non-const d’un object const. Donc, sans copier l’approche de const, y a-t-il une méthodologie que je peux utiliser en C # qui a les mêmes fins?

Je suis conscient de l’immuabilité, mais cela ne se répercute pas vraiment sur les objects conteneurs pour ne citer qu’un exemple.

J’ai souvent rencontré ce problème et j’ai fini par utiliser des interfaces.

Je pense qu’il est important de laisser tomber l’idée que C # est une forme quelconque, voire une évolution de C ++. Ce sont deux langages différents qui partagent presque la même syntaxe.

J’exprime généralement «const correct» en C # en définissant une vue en lecture seule d’une classe:

 public interface IReadOnlyCustomer { Ssortingng Name { get; } int Age { get; } } public class Customer : IReadOnlyCustomer { private ssortingng m_name; private int m_age; public ssortingng Name { get { return m_name; } set { m_name = value; } } public int Age { get { return m_age; } set { m_age = value; } } } 

Pour tirer parti de la const-craziness (ou de la pureté en termes de functional programming), vous devrez concevoir vos classes de manière à ce qu’elles soient immuables, tout comme la classe Ssortingng de c # l’est.

Cette approche est bien meilleure que le simple marquage d’un object en lecture seule, car avec des classes immuables, vous pouvez facilement transmettre des données dans des environnements multitâches.

Je voulais juste noter pour vous que beaucoup de conteneurs System.Collections.Generics ont une méthode AsReadOnly qui vous donnera une collection immuable.

C # n’a pas une telle fonctionnalité. Vous pouvez passer un argument par valeur ou par référence. La référence elle-même est immuable à moins que vous ne spécifiiez le modificateur de référence . Mais les données référencées ne sont pas immuables. Donc, vous devez faire attention si vous voulez éviter les effets secondaires.

MSDN:

Paramètres de passage

Les interfaces sont la réponse, et sont en réalité plus puissantes que “const” en C ++. const est une solution universelle au problème où “const” est défini comme “ne pas définir les membres ou appeler quelque chose qui définit les membres”. C’est un raccourci pour la constance dans de nombreux scénarios, mais pas tous. Par exemple, considérons une fonction qui calcule une valeur en fonction de certains membres mais qui met également en cache les résultats. En C ++, cela est considéré comme non-const, bien que du sharepoint vue de l’utilisateur, il soit essentiellement const.

Les interfaces vous offrent plus de flexibilité pour définir le sous-ensemble spécifique de fonctionnalités que vous souhaitez fournir à partir de votre classe. Vous voulez de la constance? Fournissez simplement une interface sans méthodes de mutation. Voulez-vous autoriser la mise en place de certaines choses mais pas d’autres? Fournir une interface avec seulement ces méthodes.

D’accord avec certains autres, utilisez des champs en lecture seule que vous initialisez dans le constructeur pour créer des objects immuables.

  public class Customer { private readonly ssortingng m_name; private readonly int m_age; public Customer(ssortingng name, int age) { m_name = name; m_age = age; } public ssortingng Name { get { return m_name; } } public int Age { get { return m_age; } } } 

Sinon, vous pouvez également append un champ d’access aux propriétés, c’est-à-dire un jeu public et un ensemble protégé?

  public class Customer { private ssortingng m_name; private int m_age; protected Customer() {} public Customer(ssortingng name, int age) { m_name = name; m_age = age; } public ssortingng Name { get { return m_name; } protected set { m_name = value; } } public int Age { get { return m_age; } protected set { m_age = value; } } } 
  • Le mot clé const peut être utilisé pour les constantes de temps de compilation telles que les types primitifs et les chaînes
  • Le mot-clé readonly peut être utilisé pour les constantes d’exécution telles que les types de référence

Le problème avec readonly est qu’il permet uniquement à la référence (pointeur) d’être constante. La chose référencée (pointée) peut encore être modifiée. C’est la partie délicate mais il n’y a pas moyen de contourner le problème. Implémenter des objects constants signifie ne pas exposer de méthodes ou de propriétés mutables, mais c’est gênant.

Voir aussi Efficace C #: 50 méthodes spécifiques pour améliorer votre C # (élément 2 – Préférer en lecture seule à const.)