78 votes

« const correctness » en c#

Je suis une lourde C++ utilisateur qui barbote en C# dans ses temps libres. Je suis aussi l'un de ceux const-correctness nazis et ainsi de ne pas être en mesure de le faire facilement en C# des grilles un peu.

Le point de const-correct est d'être en mesure de fournir une vue d'une instance qui ne peuvent pas être modifiés ou supprimés par l'utilisateur. Le compilateur prend en charge ce en pointant du doigt lorsque vous cassez constness de l'intérieur d'une const fonction, ou essayez d'utiliser un non-const fonction de const objet. Donc, sans la copie de la const approche, est-il une méthodologie que je peux utiliser en C# qui a les mêmes objectifs?

Je suis conscient de l'immuabilité, mais qui n'a pas vraiment pour le conteneur d'objets pour n'en citer qu'un exemple.

63voto

Trap Points 4042

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

Je pense qu’il est important de laisser tomber l’idée que C# est une forme quelconque, ou même une évolution de C++. Ils ont deux langues différentes qui partagent presque la même syntaxe.

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

29voto

Sam Points 9445

Pour obtenir le bénéfice de const-folie (ou pureté en termes de programmation fonctionnelles), vous devrez concevoir vos classes de manière afin qu’ils soient immuables, tout comme la classe String de c#.

Cette approche est bien meilleur que juste marquer un objet comme readonly, depuis avec immuable classes vous envoie les données autour facilement dans les environnements multi-tâches.

24voto

Rick Minerich Points 2407

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

4voto

aku Points 54867

C# n’a pas cette fonctionnalité. Vous pouvez passer des arguments par valeur ou par référence. Référence elle-même est immuable, à moins que vous spécifiiez modificateur ref . Mais les données à référence n’est pas immuables. Vous devez donc être prudent si vous voulez éviter les effets secondaires.

MSDN :

Passage de paramètres

3voto

munificent Points 6516

Les Interfaces sont la réponse, et sont en fait plus puissant que "const en C++. const est un one-size-fits-all solution pour le problème où "const" est défini comme "ne définit pas les membres ou appeler quelque chose qui définit les membres". C'est un bon raccourci pour const-ness dans de nombreux scénarios, mais pas tous d'entre eux. Par exemple, considérons une fonction qui calcule une valeur en fonction de certains membres, mais aussi met en cache les résultats. En C++, c'est considéré comme un non-const, bien que, dans la perspective de l'utilisateur, il est essentiellement const.

Les Interfaces de vous donner plus de flexibilité dans la définition du sous-ensemble spécifique de capacités que vous voulez pour fournir à partir de votre classe. Voulez const-ness? Il suffit de fournir une interface avec aucune mutation des méthodes. Souhaitez autoriser la définition de certaines choses, mais pas d'autres? Fournir une interface avec juste ces méthodes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X