Wie kann eine variable (nicht Klasse) "nur Lesen" in C#
Ich bin neu in der C# Welt und ich kann nicht finden, eine Methode zu deklarieren, die nur-lese-variable in C# (so etwas wie das "const" - variable in c++). Gibt es eine?
Ich gebe Ihnen ein Beispiel:
...
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
}
dude ich denke, nach dem
referential transparency
Richtlinien ist genug, Ihr methods must be as small
, die Sie bekommen können, was es machen soll auf einen Blick .InformationsquelleAutor devfreak | 2011-01-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es nicht eine identische analoge.
Den
readonly
Schlüsselwort können die Variablen Wert mutiert, aber nur in einem Konstruktor.Den
const
Schlüsselwort bedeutet, dass der Wert nicht mutieren und muss eine compile-Zeit-Konstante und kann nur einen der folgenden Typen: sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string, enum-Typ oder ein Referenz-Typ. (C# 4.0 spec §10.4).Und in c#
readonly
gilt nur für Felder und angewendet werden kann nicht auf lokale Variablen.const
können nicht angewendet werden, um jeden DatentypGenau wie ich es erwartet habe, wollte nur sicher sein, Danke!
InformationsquelleAutor Oded
Nein, es gibt keine Lösung für dein code-Beispiel.
const
in C# ist für compile-Zeit-Konstanten, und da deine variable erhält Ihren Wert aus einer Funktion nicht bekannt ist, zur compile-Zeit.Den
readonly
Schlüsselwort hat eine Art, was du suchst, aber das ist nur für member-Variablen in Klassen (und erlaubt nur Variablen gesetzt werden, die im Konstruktor der Klasse).Aber, auf der anderen Seite, warum würde Sie jemals brauchen? Wenn Ihre Funktion sehr lange, es sollte umgestaltet werden in kleinere Funktionen. Wenn es nicht sehr lange, dann warum würden Sie brauchen, um die Durchsetzung einer Regel wie dieser? Nur nicht zuordnen
readOnlyVar
ist wahrscheinlich meine beste Vorschlag für Sie, fürchte ich.InformationsquelleAutor Jakob
Gibt es zwei Möglichkeiten, um eine variable zu setzen, als nur zu Lesen.
Dem const-Schlüsselwort wird festgelegt, den Wert zur compile-Zeit. Das readonly-Schlüsselwort wird festgelegt, den Wert bei der Konstruktion. Also, wenn Sie müssen unterschiedliche Werte für jede Instanz verwenden readonly. Ansonsten verwenden Sie const.
InformationsquelleAutor Hypnovirus
in c#, die wir mit const oder readonly-Schlüsselwort zum deklarieren einer Konstante.
const
Als eine Konstante definiert zur compile-Zeit und zur Laufzeit nicht geändert werden. Konstanten deklariert ein Feld mit dem Schlüsselwort const und muss initialisiert werden, wie Sie deklariert sind. Zum Beispiel;
PI kann nicht geändert werden, in der Anwendung irgendwo anders im code, da dies zu einem compiler-Fehler.
readonly
Einem nur-lese-Mitglied ist wie eine Konstante, es stellt einen unveränderlichen Wert. Der Unterschied ist, dass ein readonly-Mitglied kann initialisiert werden, zur Laufzeit im Konstruktor, er kann initialisiert werden, wie Sie deklariert sind. Zum Beispiel:
oder
Weil ein readonly-Feld kann initialisiert werden, entweder bei der Deklaration oder in einem Konstruktor, readonly-Felder können unterschiedliche Werte haben, abhängig von der Konstruktor verwendet. Ein readonly-Feld kann auch verwendet werden, für die Laufzeit-Konstanten wie im folgenden Beispiel:
Hinweise
readonly-Mitglieder sind nicht unbedingt statisch, und daher das Schlüsselwort static kann angewendet werden, um ein readonly-Feld explizit, falls erforderlich.
Einem readonly-member zu halten, kann ein Komplexes Objekt mit dem Schlüsselwort new bei der Initialisierung.
readonly-Mitglieder nicht halten Aufzählungen.
Kredit geht hier:
http://www.dotnetspider.com/forum/69474-what-final-c-i-need-detailed-nfo.aspx
InformationsquelleAutor fingerman
Dies ist nicht eine Sprache verfügen, sondern du bist nicht die einzige person, die Interesse an einer solchen Funktion. Sie haben einige Optionen, wenn. Sie ersetzen könnte Ihre Methode ist die Umsetzung mit einer Klasse, die
readonly
member-Variablen. Dies ist ein großer Schmerz, aber, und wirklich explodiert die Größe des Codes. (Wenn Sie schreiben, Lambda-Ausdrücke oder verwenden Sieasync
Methoden, C# etwas ähnliches ist, heben Sie die einheimischen, class-Felder und verwandelt Ihren lambda-oder async-Methode in Methoden auf eine automatisch generierte Klasse darstellt. Wir sind im Grunde die gleiche Sache zu tun, sondern manuell so, dass wirreadonly
.)Andere alternative, die benötigt weniger code, aber immer noch klobig ist, um den Missbrauch einer Funktion der
foreach
. Dieforeach
Schlüsselwort nicht lassen, die Sie zuweisen, wird die iteration variable. So konnte man etwas wie das hier tun:Den
foreach
- Methode macht es einfacher zu bedienen anonyme Typen, aber man könnte Generika kombiniert mit Typ-Inferenz verwenden anonyme Typen mit der Methode der Klasse.InformationsquelleAutor binki