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.