2010-01-13 14 views
26

Wie deklariert man eine lokale Konstante in C#?Wie deklariert man eine lokale Konstante in C#?

Wie in Java, können Sie wie folgt vorgehen:

public void f(){ 
    final int n = getNum(); // n declared constant 
} 

, wie diese in C# zu tun? Ich versuchte mit readonly und const, aber keiner scheint zu arbeiten.

Jede Hilfe würde sehr geschätzt werden.

Danke.

+11

Dies ist die ärgerlichste Auslassung von C# in meiner kurzen Zeit, die es verwendet. Ich benutze ständig lokale Variablen in C++ für meine eigene Sicherheit, Vernunft und Lesbarkeit. – pauldoo

+0

http://stackoverflow.com/questions/443687/why-does-c-sharp-disallow-readonly-local-variables –

+0

@MauricioScheffer, danke für den Link. Obwohl ich jetzt, wenn ich etwas für .NET schreiben muss, werde ich ganz sicher F # verwenden. :-) – missingfaktor

Antwort

19

In C# können Sie keine Konstante erstellen, die von einer Methode abgerufen wird.

Edit: Toten Link http://msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx

Dieses Dokument sollte helfen: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/const

Ein konstanter Ausdruck ist ein Ausdruck, der bei Kompilierung vollständig ausgewertet werden kann.

+14

Nun, das ist scheiße. :/ –

+5

Brutal. Ich sollte nicht nur unterstützt werden, es sollte der Standard sein. – andyczerwonka

+0

'final' und' const' haben unterschiedliche Bedeutungen. In C# muss ein "const" Wert zur Kompilierzeit bekannt sein. Das wirkliche Problem ist, dass C# lokale 'readonly' -Variablen nicht unterstützt, was zu schade ist, weil sie praktisch sind. – Nick

6

Ich bin mir nicht sicher, warum readonly und const nicht für Sie arbeiten, da dies die Schlüsselwörter sind, die Sie benötigen. Sie verwenden const, wenn Sie eine wörtliche (mit Ausnahme von Array-Literale) haben und readonly anders:

public void f() 
{ 
    const int answer = 42; 
} 

private readonly int[] array = new int[] { 1, 2, 3, 4 }; 
private readonly DateTime date = DateTime.Now; 
public void g() 
{ 
    Console.WriteLine(date.ToString()); 
} 

readonly funktioniert nur auf Klassenebene (das heißt, können Sie nur anwenden, um Felder). Als Konsequenz von const, das ein Literal erfordert, ist es von Natur aus statisch, während ein readonly Feld entweder statisch oder instance sein kann.

+2

Es ist wichtig zu beachten, dass das Erstellen einer schreibgeschützten Instanz eines Referenztyps nur bedeutet, dass die Referenz selbst nicht geändert werden kann; Das Objekt kann weiterhin normal geändert werden (es sei denn, der Typ ist unveränderlich wie String). –

+3

Die Antwort auf ** Ihre ** Frage ist einfach - keine von ihnen (const, readonly) würde in einem gegebenen Beispiel funktionieren. – greenoldman

1

Das const Schlüsselwort wird verwendet, um eine Deklaration eines Feldes oder lokaler Variable zu ändern.

Von MSDN.

Da C# "const correctes" (wie C++) sowieso nicht erzwingen kann, halte ich das nicht für sehr nützlich. Da Funktionen sehr eng begrenzt sind, ist es leicht, die Aufsicht nicht zu verlieren.

+0

Ich muss jedoch darauf hinweisen, dass Eric Dahlvang immer noch Recht hat, warum const in Ihrem Fall nicht funktioniert hat. –

+0

"Da Funktionen sehr eng begrenzt sind, ist es leicht, den Überblick nicht zu verlieren." - Warum bieten andere Sprachen wie C++ und Java einen solchen Mechanismus? – missingfaktor

+0

Ich weiß nichts über Java, aber C++ kann auch bei Verweisen wahres const erzwingen, was C# nicht kann. Ich habe nie gesehen, dass const irgendwo anders als in C++ verwendet wird. –

1

In dem Beispiel, das Sie angegeben haben, müssen Sie die Variable als static deklarieren, da Sie sie mit einem Methodenaufruf initialisieren. Wenn Sie mit einem konstanten Wert wie 42 initialisiert haben, können Sie const verwenden. Für Klassen, Strukturen und Arrays sollte readonly funktionieren.

+7

Bitte beachten Sie, dass Sie statische Variablen nicht nur für Mitglieder verwenden können. –

9

Deklarieren Sie Ihre lokale Variable als Iterationsvariable. Iterationsvariablen werden nur gelesen (Sie haben nicht nach einer schönen Lösung gefragt).

public void f() 
{ 
    foreach (int n in new int[] { getNum() }) // n declared constant 
    { 
    n = 3; // won't compile: "error CS1656: Cannot assign to 'n' because it is a 'foreach iteration variable'" 
    } 
} 
+3

Gut zu wissen, aber Gott versprechen, das werde ich nie tun. – missingfaktor

+0

Das ist golden) Dieser Hack ist so hässlich, dass ich nicht einmal darüber nachgedacht habe. Ich werde es definitiv (als Snippet) verwenden, um meinen Code zu überprüfen, wissen Sie, temporär ändern 'var index = GetNum()' zu 'foreach', um den Compiler zu zwingen, meinen Code zu überprüfen. –

+0

omg. Immer noch meinen Kopf auf den Tisch schlagend, während ich ernsthaft darüber nachdenke, diesen Hack zu benutzen. Was für ein wirklich dreckiger ;-) –

2

Es gibt eine Art Problemumgehung, die ReSharper erfordert. Sie können nicht nur lokal lesen, aber Sie können mutierte erkennen und sie anders färben.

Verwenden Sie das Element Schriftarten und Farben Resharper Änderbare lokale Variablen-ID.

Für mich habe ich Einheimische grau gefärbt, und dann wählte ich ein fettes Weiß für die mutierten Variablen (das ist mit einem dunklen Thema). Dies bedeutet, dass jede Variable, die mehr als einmal geschrieben wird, hell im Vergleich zu regulären Variablen angezeigt wird. Sie können dann tun, was Sie können, um zu vermeiden, eine mutierte Variable zu haben, oder wenn die Methode wirklich eine erfordert, dann wird sie zumindest hervorgehoben.

+0

Es funktioniert nicht für mich. Es zeigt nur die Loop-Zähler als nicht änderbar, alles andere ist veränderlich, egal wie viele Schreibvorgänge. Ich schätze mein Resharper ist zu alt :-) –

+0

@ Xan-KunClark-Davis es zeigt nicht was veränderbar ist, es zeigt was mutiert ist. Alles, was genau einmal geschrieben wird, wird normal aussehen. Alles, was zweimal oder öfter geschrieben wird, wird hervorgehoben. (Oh ich denke du hast gesagt "egal wie viele schreibt"). bist du sicher? etwas wie 'int x = 5; x = 3; ', x sollte die Farbe ändern. Ich denke, es könnte die Version sein, ja. –

+0

@ Sahuagin Ja, ich bekomme den Teil, den du irgendwie umdrehen musst, alle Einheimischen werden highlightet und alle Mutables werden wieder "normalisiert", aber trotzdem ändert sich die Farbe nicht. Ich werde es wieder mit einem sauberen Projekt versuchen. –