Comment faire une variable (non membre de la classe) “lecture seule” en C#
Je suis nouveau sur le C# monde et je ne peux pas trouver une méthode pour déclarer en lecture seule variable en C# (quelque chose comme la déclaration de "const" variable en c++). Est-il un?
Je vais vous donner un exemple:
...
int f() { return x; } //x is not const member
...
void g() {
int readOnlyVar = f(); //is there a method to declare readOnlyVar as read only or const
//Some code in which I want to restrict access to readOnlyVar to read only
}
mec, je pense, à la suite de la
referential transparency
lignes directrices est assez, votre methods must be as small
que vous pouvez obtenir ce qui est censé faire en un clin d'œil .OriginalL'auteur devfreak | 2011-01-08
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas un nombre identique de l'analogique.
La
readonly
mot-clé permet de la valeur de la variable à être muté, mais seulement dans un constructeur.La
const
mot clé est la valeur ne peut pas muter et doit être un moment de la compilation constante et ne peut être l'un des types suivants: sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string, un enum type, ou une référence de type. (C# 4.0 spec §10.4).Et en c#,
readonly
s'applique uniquement aux champs et ne peut pas être appliquée aux variables locales.const
ne peut pas être appliqué à chaque type de donnéesExactement comme je m'y attendais, je voulais juste être sûr, Merci!
OriginalL'auteur Oded
Non, il n'existe pas de solution pour votre code-exemple.
const
en C# est pour des constantes de compilation et depuis votre variable reçoit sa valeur à partir d'une fonction, il n'est pas connu au moment de la compilation.La
readonly
mot ne sorte de ce que vous cherchez, mais c'est seulement pour les membres des variables dans les classes (et ne permet variables à définir dans le constructeur de la classe).Mais, d'autre part, pourquoi voudriez-vous jamais besoin? Si votre fonction est très long, il devrait être remaniée en petites fonctions. Si ce n'est pas très longue, alors pourquoi auriez-vous besoin d'appliquer une règle de ce type? Il suffit de ne pas céder à
readOnlyVar
est probablement ma meilleure suggestion pour vous, je le crains.OriginalL'auteur Jakob
Il y a deux façons de définir une variable en lecture seule.
Le mot-clé const sera mis à la valeur au moment de la compilation. Le mot clé readonly sera mis à la valeur au moment de la construction. Donc, si vous avez besoin de différentes valeurs pour chaque instance, l'utilisation en lecture seule. Sinon, l'utilisation de const.
OriginalL'auteur Hypnovirus
en c# nous avoir const ou mot clé readonly pour déclarer une constante.
const
Une constante membre est défini au moment de la compilation et ne peut pas être modifiée lors de l'exécution. Les constantes sont déclarées comme un champ, en utilisant le mot-clé const et doit être initialisé comme elles sont déclarées. Par exemple;
PI ne peut pas être modifié dans l'application de n'importe où ailleurs dans le code comme ceci provoquera une erreur de compilation.
readonly
Lire un seul membre est comme une constante en ce qu'il représente une valeur immuable. La différence est qu'un membre readonly peut être initialisée lors de l'exécution, dans un constructeur comme pouvant être initialisé comme elles sont déclarées. Par exemple:
ou
Parce qu'un champ en lecture seule peuvent être initialisé soit lors de la déclaration ou dans un constructeur, readonly les champs peuvent avoir des valeurs différentes selon le constructeur utilisé. Un champ en lecture seule peuvent également être utilisés pour l'exécution des constantes comme dans l'exemple suivant:
Notes
readonly les membres ne sont pas implicitement statique, et donc le mot-clé static peut être appliquée à un champ en lecture seule façon explicite si nécessaire.
Un membre readonly peut contenir un objet complexe en utilisant le nouveau mot-clé à l'initialisation.
readonly membres ne peuvent pas tenir les énumérations.
de crédit va ici:
http://www.dotnetspider.com/forum/69474-what-final-c-i-need-detailed-nfo.aspx
OriginalL'auteur fingerman
Ce n'est pas un langage, mais vous n'êtes pas la seule personne ayant un intérêt dans une telle fonctionnalité. Vous avez quelques options, bien que. Vous pouvez remplacer votre méthode est mise en œuvre avec une classe qui a
readonly
variables membres. C'est une grande douleur, cependant, et vraiment explose la taille de votre code. (Lorsque vous écrivez des lambdas ou de l'utilisationasync
méthodes, C# fait quelque chose de semblable pour soulever les habitants de champs de la classe et transforme votre lambda ou asynchrone de la méthode dans les méthodes d'une classe générée automatiquement. Nous sommes essentiellement faire la même chose, mais manuellement de sorte que nous pouvons mettre enreadonly
.)Une autre alternative qui nécessite moins de code, mais est encore maladroit est de l'abus d'une fonction de
foreach
. Leforeach
mot-clé ne vous permet pas d'attribuer à la variable d'itération. Donc, vous pourriez faire quelque chose comme ceci:La
foreach
méthode rend plus facile à utiliser les types anonymes, mais vous pouvez utiliser des génériques combiné avec l'inférence de type pour l'utilisation des types anonymes avec la méthode de classe.OriginalL'auteur binki