Ist es möglich, etwas Ähnliches wie das Folgende zu schreiben?
public const string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };
Ist es möglich, etwas Ähnliches wie das Folgende zu schreiben?
public const string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };
Ja, aber Sie müssen es anmelden readonly
代わりに const
:
public static readonly string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };
Der Grund dafür ist, dass const
kann nur auf ein Feld angewendet werden, dessen Wert zur Kompilierzeit bekannt ist. Der Array-Initialisierer, den Sie gezeigt haben, ist kein konstanter Ausdruck in C#, so dass er einen Compilerfehler erzeugt.
Die Erklärung readonly
löst dieses Problem, da der Wert erst zur Laufzeit initialisiert wird (obwohl er garantiert schon vor der ersten Verwendung des Arrays initialisiert wurde).
Je nachdem, was Sie letztendlich erreichen wollen, können Sie auch die Deklaration einer Aufzählung in Betracht ziehen:
public enum Titles { German, Spanish, Corrects, Wrongs };
Beachten Sie, dass die Array hier ist natürlich nicht schreibgeschützt; Titles[2]="Welsh"; würde zur Laufzeit gut funktionieren
Wie wäre es, ein "const"-Array in einem Methodenkörper zu deklarieren, nicht in dem der Klasse?
Sie können kein 'const' Array erstellen, da Arrays Objekte sind und nur zur Laufzeit erstellt werden können und const-Entitäten zur Kompilierzeit aufgelöst werden.
Stattdessen können Sie Ihr Array als "readonly" deklarieren. Dies hat den gleiche Wirkung wie const, außer dass der Wert zur Laufzeit gesetzt werden kann. Er kann nur einmal gesetzt werden und ist danach ein readonly (d.h. konstanter) Wert.
Sie können Array deklarieren als readonly
, aber denken Sie daran, dass Sie das Element der readonly
Array.
public readonly string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };
...
Titles[0] = "bla";
Erwägen Sie die Verwendung von enum, wie von Cody vorgeschlagen, oder IList.
public readonly IList<string> ITitles = new List<string> {"German", "Spanish", "Corrects", "Wrongs" }.AsReadOnly();
In .NET 4.5 und höher können Sie eine Liste als IReadOnlyList<string> anstelle von IList<string> deklarieren.
Dies ist die einzig richtige Antwort. Sie können dies derzeit nicht tun.
Alle anderen Antworten schlagen die Verwendung statischer Nur-Lese-Variablen vor, die ähnlich wie aber nicht dasselbe wie eine Konstante. Eine Konstante ist fest in der Baugruppe kodiert. Eine statische schreibgeschützte Variable kann nur einmal festgelegt werden, wahrscheinlich bei der Initialisierung eines Objekts.
Diese sind manchmal austauschbar, aber nicht immer.
EDITAR : Ich dachte, ich werfe dies ein, da es scheint, wie die Person, die die Frage gestellt wurde ein wenig verschwommen über Arrays. Wenn Sie ein Array deklarieren, ist es ein Zeiger auf ein Speichersegment, das das Array enthält. Es ist sehr einfach, da es nur eine Adresse ist, ohne komplexe Logik, die steuert, ob es lesbar oder schreibbar ist. Sie erhalten einen Zeiger, mit dem Sie tun können, was Sie wollen.
Dies ist einer der Gründe, warum es ein wenig schwierig ist, ein unveränderliches Array zu erstellen. Man könnte eine Klasse schreiben, die das Array umhüllt und nur das Lesen zulässt, indem man eine Kopie zurückgibt, aber dann ist es nicht mehr wirklich ein Array, sondern ein Objekt, das ein Array umhüllt.
Einige Leute haben vorgeschlagen, static oder readonly zu verwenden, um das Verhalten zu simulieren, das Sie sehen würden, wenn Sie const array erstellen könnten. Diese haben einige Nebeneffekte, die für den Gelegenheitsleser nicht offensichtlich sein könnten.
Um wirklich ein const-Array zu erhalten, müsste C# und der MSIL zugrunde liegende Code aktualisiert werden, um das Lesen aus einem Array, aber nicht das Schreiben zu ermöglichen.
Seit C# 6 können Sie es so schreiben:
public static string[] Titles => new string[] { "German", "Spanish", "Corrects", "Wrongs" };
Siehe auch: C#: Das neue und verbesserte C# 6.0 (insbesondere das Kapitel "Ausdruckskörperliche Funktionen und Eigenschaften")
Dadurch wird eine statische Eigenschaft schreibgeschützt, aber Sie können den Inhalt des zurückgegebenen Arrays immer noch ändern, aber wenn Sie die Eigenschaft erneut aufrufen, erhalten Sie wieder das ursprüngliche, unveränderte Array.
Zur Klarstellung: Dieser Code ist dasselbe wie (oder eigentlich eine Abkürzung für):
public static string[] Titles
{
get { return new string[] { "German", "Spanish", "Corrects", "Wrongs" }; }
}
Bitte beachten Sie, dass dieser Ansatz eine Kehrseite hat: Für jeden Verweis wird ein neues Array instanziiert. Wenn Sie also ein sehr großes Array verwenden, ist dies möglicherweise nicht die effizienteste Lösung. Wenn Sie jedoch dasselbe Array wiederverwenden (z. B. in einem privaten Attribut), eröffnet dies wiederum die Möglichkeit, den Inhalt des Arrays zu ändern.
Wenn Sie ein unveränderliches Array (oder eine Liste) haben möchten, können Sie auch verwenden:
public static IReadOnlyList<string> Titles { get; } = new string[] { "German", "Spanish", "Corrects", "Wrongs" };
Dies birgt jedoch immer noch ein Risiko für Änderungen, da man sie immer noch in einen string[] zurückverwandeln und den Inhalt ändern kann:
((string[]) Titles)[1] = "French";
Ein Feld kann nicht bei jedem Aufruf ein neues Objekt zurückgeben. Eine Eigenschaft ist im Grunde eine Art "verdeckte Funktion".
Wenn Sie sich auf die letzte Option beziehen, kann dies sowohl mit einem Feld als auch mit einer Eigenschaft geschehen, aber da es öffentlich ist, bevorzuge ich eine Eigenschaft. Seit der Einführung von Eigenschaften verwende ich nie ein öffentliches Feld.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
Static verwendet werden könnte, public static string[] Titles = new string[] {"Deutsch", "Spanisch"};