106 votes

Pourquoi les paramètres const ne sont pas autorisés en C #

Cela semble étrange surtout pour les développeurs C ++. En C ++, nous marquions le paramètre comme const afin de nous assurer que son état ne serait pas modifié dans la méthode. Il existe également d'autres raisons spécifiques à C ++, telles que le fait de passer const ref afin de passer par référence et de s'assurer que cet état ne sera pas modifié. Mais pourquoi ne pouvons-nous pas marquer comme paramètres de méthode const dans C #?

Pourquoi je ne peux pas déclarer ma méthode comme ceci:

     ....  
    static void TestMethod1(const MyClass val)
    {}
    ....
    static void TestMethod2(const int val)
    {}
    ....
 

58voto

Eric Lippert Points 300275

En plus de l'autre les bonnes réponses, je vais ajouter encore une autre raison de ne pas mettre de C-style constness en C#. Vous avez dit:

nous marque paramètre const, afin d'être sûr que son état ne sera pas modifiée dans la méthode.

Si const fait que, ce serait génial. Const ne pas le faire. Le const est un mensonge!

Const ne fournit pas de garantie que je peux l'utiliser effectivement. Supposons que vous avez une méthode qui prend un const chose. Il y a deux auteurs de code: la personne qui écrit l' appelant et la personne qui écrit le destinataire de l'appel. L'auteur de l'appelant a fait de la méthode de prendre un const. Quels peuvent être les deux auteurs supposent est invariante à propos de l'objet?

Rien. Le destinataire de l'appel est libre de rejeter la const et la mutation de l'objet, de sorte que l'appelant n'a aucune garantie que l'appel d'une méthode qui prend un const sera pas muter. De même, le destinataire ne peut pas supposer que le contenu de l'objet ne changera pas tout au long de l'action de l'appelant; le destinataire de l'appel pourrait appeler la mutation de la méthode sur un non const alias de la const objet, et maintenant le const objet a changé.

C-style const fournit aucune garantie que l'objet ne changera pas, et est donc rompu. Maintenant, C déjà de la a un faible type de système dans lequel on peut faire un réinterpréter le casting d'un double en int si vous le voulez vraiment, donc il ne devrait pas être une surprise qu'elle n'a qu'une faible type de système en vue de la const. Mais C# a été conçu pour avoir un bon système de type, d'un type de système, où lorsque vous dites "cette variable contient une chaîne de caractères" que la variable contient une référence à une chaîne de caractères (ou null). Nous ne veux absolument pas mettre un style C "const" est utilisé dans le système de type, car nous ne voulons pas que le système de type à être un mensonge. Nous voulons que le système de type à être fort afin que vous puissiez raison correctement sur votre code.

Const en C est une ligne directrice; il signifie "vous pouvez me faire confiance de ne pas essayer de muter cette chose". Qui ne devrait pas être dans le type de système; la substance dans le type de système devrait être fait à propos de l'objet que vous pouvez la raison, non pas une ligne directrice pour son utilisation.

Maintenant, ne vous méprenez pas; tout simplement parce que const en C est profondément rompu ne signifie pas que l'ensemble du concept est inutile. Ce que j'aimerais voir, c'est certain fait correct et utile forme de "const" annotation en C#, une annotation que les humains et les compilateurs peut utiliser pour les aider à comprendre le code, et que le moteur d'exécution pourraient utiliser pour faire des choses comme automatique paralellization et d'autres optimisations avancées.

Par exemple, imaginez si vous pouviez "dessiner une case" autour d'un morceau de code et de dire "j'ai la garantie que ce morceau de code n'effectue aucune des mutations à tous les champs de cette classe" d'une façon qui pourrait être vérifié par le compilateur. Ou de dessiner une case qui dit "cette pure méthode de mutation de l'état interne de l'objet, mais pas dans une manière qui est observable en dehors de la boîte". Un tel objet ne peut être en toute sécurité multi-thread automatiquement, mais il pourrait être automatiquement memoized. Il ya toutes sortes d'intéressantes annotations, nous pourrions mettre sur le code qui permettrait riche optimisations et de compréhension. Nous pouvons faire bien mieux que de la faiblesse de style C const annotation.

Cependant, j'insiste sur le fait que c'est juste de la spéculation. Nous n'avons pas de plans précis pour mettre ce genre de fonctionnalité dans tout futur hypothétique version de C#, si il n'y a même un, ce qui nous n'ont pas annoncé d'une façon ou de l'autre. C'est quelque chose que j'aimerais voir, et quelque chose qui l'à venir, l'accent sur le multi-core de calcul nécessaire, mais rien de tout cela ne doit en aucun cas être interprété comme une prévision ou une garantie de toute caractéristique particulière ou de l'orientation future pour C#.

Maintenant, si ce que vous voulez, c'est simplement une annotation sur la variable locale qui est un paramètre qui dit que "la valeur de ce paramètre ne change pas tout au long de la méthode", puis, bien sûr, qui serait facile à faire. Nous pourrions soutenir "readonly" les habitants et les paramètres qui devraient être initialisé une fois, et une erreur de compilation de changement dans la méthode. La variable déclarée par l'instruction "using" est déjà un local; on pourrait ajouter une option annotation à tous les habitants et les paramètres de les faire agir comme "l'aide" des variables. Il n'a jamais été une très haute priorité à la fonctionnalité de sorte qu'il n'a jamais été mis en œuvre.

26voto

Ruben Points 8393

Une des raisons pour lesquelles il n'y a pas const exactitude en C# est parce qu'il n'existe pas au niveau d'exécution. Rappelez-vous que C# 1.0 n'a aucune fonction à moins qu'elle faisait partie de l'exécution.

Et, pour plusieurs raisons, le CLR ne pas avoir une notion de const correction sont par exemple:

  1. Cela complique l'exécution; en outre, la JVM ne l'ai pas non plus, et le CLR fondamentalement commencé comme un projet de création d'une JVM-comme l'exécution et non pas en C++une comme de l'exécution.
  2. Si il y a const exactitude lors de l'exécution, il doit être const justesse dans la BCL, sinon la fonction est à peu près inutile autant que l' .NET Framework est concerné.
  3. Mais si la BCL nécessite const exactitude, de toutes les langues sur le dessus de la CLR devrait soutenir const exactitude (VB, JavaScript, Python, Ruby, F#, etc.) C'est pas qui va se passer.

Const correctness est assez bien une langue fonctionnalité présente seulement dans le C++. Donc, il se résume à la même argumentation pour expliquer pourquoi le CLR ne nécessite pas vérifié exceptions (qui est un langage Java-uniquement).

Aussi, je ne pense pas que vous pouvez introduire un tel type fondamental de la fonctionnalité du système dans un environnement géré sans casser la compatibilité descendante. Donc, ne comptez pas sur const correctness jamais entrer dans le C# monde.

15voto

Stephen Cleary Points 91731

Je crois qu'il y a deux raisons C# n'est pas const-correct.

La première est understandibility. Quelques programmeurs C++ comprendre const-correct. L'exemple simple d' const int arg est mignon, mais j'ai aussi vu char * const * const arg - un pointeur constant constant des pointeurs vers des non-constante de caractères. Const-correctness sur les pointeurs de fonctions est un tout nouveau niveau de l'obscurcissement.

Le second est parce que la classe arguments sont des références passé par valeur. Cela signifie qu'il y a déjà deux niveaux de constness à traiter, sans évidemment clair de la syntaxe. Un semblable point d'achoppement est des collections (et des collections de collections, etc).

Const-correct est une partie importante du C++ type de système. Il peut - en théorie - être ajouté à C# comme quelque chose qui n'est activée au moment de la compilation (il n'a pas besoin d'être ajouté à la CLR, et ne pas affecter la BCL, à moins que la notion de const membre de méthodes ont été inclus).

Cependant, je crois que c'est peu probable: la deuxième raison (syntaxe), il serait assez difficile à résoudre, ce qui en ferait la première raison (understandibility) encore plus d'un problème.

5voto

Pavel Minaev Points 60647

const signifie "constante à la compilation" en C#, pas "readonly mais peut-être mutable par un autre code" comme en C++. Une rude analogique de C++ const en C# est - readonly, mais que l'on n'est applicable qu'aux champs. A côté de cela, il n'y a pas de C++-comme la notion de const justesse en C#.

Le raisonnement est difficile à dire, car il y a beaucoup de raisons possibles, mais ma conjecture serait le désir de garder la langue simple d'abord et avant tout, et incertain avantages de la mise en œuvre de cette deuxième.

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