Ist es möglich, ein leeres Array ohne Angabe der Größe zu erstellen?
Zum Beispiel habe ich erstellt:
String[] a = new String[5];
Können wir das obige String-Array ohne die Größe erstellen?
c#
arrays
initialization
Yogesh
quelle
quelle
Antworten:
Wenn Sie eine Sammlung verwenden, deren Größe Sie nicht im Voraus kennen, gibt es bessere Optionen als Arrays.
Verwenden Sie
List<string>
stattdessen ein - Sie können so viele Elemente hinzufügen, wie Sie benötigen. Wenn Sie ein Array zurückgeben müssen, rufen SieToArray()
die Variable auf.Wenn Sie ein leeres Array erstellen müssen , können Sie dies tun:
quelle
string[]
, das keine Elemente hat. Wenn Sie versuchen, darauf zuzugreifenemptyStringArray[0]
, erhalten Sie eineIndexOutOfRangeException
Versuche dies:
quelle
int[] variable = new int[]{}
und verwenden, zum Beispiel in einer Schleife, wieforeach (var s in variable){ Console.WriteLine(s);}
der Code, wird kompiliert zu:int[] args1 = new int[0];
undforeach (int num in args1){Console.WriteLine(num);}
. Es sollte also keinen Unterschied zwischen der Verwendung vonnew int[0]
und geben,new int[]{}
da beide mit demselben Code kompiliert werden.var
, allerdings nur für lokale Variablen (nicht für Felder). In C # 2.0 (Visual Studio 2005) und früheren Versionen mussten Sie jedoch die Syntax dieser Antwort (oderstring[] a = new string[0];
) verwenden.In .NET 4.6 wird bevorzugt eine neue Methode verwendet
Array.Empty
:Die Implementierung ist prägnant und verwendet das Verhalten statischer Elemente in generischen Klassen in .Net :
(Code vertragsbezogener Code aus Gründen der Übersichtlichkeit entfernt)
Siehe auch:
Array.Empty
Quellcode auf ReferenzquelleArray.Empty<T>()
quelle
Enumerable.Empty<T>().ToArray()
Array.Empty<T>()
ist nicht ein Array erstellen. Es gibt einen Verweis auf ein vorab zugewiesenes Array zurück.Sie können es mit einer Größe von 0 initialisieren, müssen es jedoch neu initialisieren, wenn Sie die Größe kennen, da Sie es nicht an das Array anhängen können.
quelle
Es macht nicht viel Sinn, ein Array ohne Größe zu deklarieren. Ein Array hat ungefähr die Größe . Wenn Sie ein Array mit einer bestimmten Größe deklarieren, geben Sie die feste Anzahl von Slots an, die in einer Sammlung verfügbar sind, die Dinge aufnehmen können, und dementsprechend wird Speicher zugewiesen. Um etwas hinzuzufügen, müssen Sie das vorhandene Array trotzdem neu initialisieren (auch wenn Sie die Größe des Arrays ändern, siehe diesen Thread ). Einer der seltenen Fälle, in denen Sie ein leeres Array initialisieren möchten, besteht darin, das Array als Argument zu übergeben.
Wenn Sie eine Sammlung definieren möchten, wenn Sie nicht wissen, welche Größe sie möglicherweise haben könnte, ist das Array nicht Ihre Wahl, sondern so etwas wie ein
List<T>
oder ähnliches.Die einzige Möglichkeit, ein Array ohne Angabe der Größe zu deklarieren, besteht darin, ein leeres Array der Größe 0 zu haben . Hemant und Alex Dn bieten zwei Möglichkeiten. Eine andere einfachere Alternative ist einfach :
[ Die Elemente in der Klammer sollten implizit in den definierten Typ konvertierbar sein, z. B.
string[] a = { "a", "b" };
]Oder noch eine andere:
Hier ist ein deklarativerer Weg :
Jetzt können Sie anrufen:
quelle
Einfach und elegant!
quelle
array
einfach änderna
, wiearray
es ein Schlüsselwort ist, wenn es groß geschrieben wird. Es ist nur eine schlechte Praxis, einen Schlüsselwortnamen als Variablennamen zu verwenden - auch wenn der Fall anders ist. Und im Grunde das gleiche wie meine Antwort, außer dass ich dortString.Empty
drin war.a
ist schlecht?string[] a = new string[0];
oder kurze Notation:
string[] a = { };
Der bevorzugte Weg ist jetzt:
var a = Array.Empty<string>();
Ich habe einen kurzen regulären Ausdruck geschrieben, den Sie in Visual Studio verwenden können, wenn Sie Zuordnungen mit der Länge Null ersetzen möchten, z
new string[0]
. Verwenden Sie Suchen (Suchen) in Visual Studio mit aktivierter Option für reguläre Ausdrücke:new[ ][a-zA-Z0-9]+\[0\]
Jetzt Find All oder F3 (Find Next) und ersetze alle durch Array.Empty <…> ()!
quelle
Sie können die Arraygröße zur Laufzeit definieren .
Auf diese Weise können Sie alles tun, um die Größe des Arrays dynamisch zu berechnen. Einmal definiert, ist die Größe jedoch unveränderlich.
quelle
int i = 5; string[] a = new string[i];
Ich hatte versucht:
Aber ich konnte nur eine Zeichenfolge einfügen, und dann bekam ich einen exceptionOutOfBound-Fehler, also habe ich einfach eine Größe dafür eingefügt, wie z
Oder eine andere Art und Weise, die für mich funktioniert:
Wert für Liste zuweisen:
quelle
Wie ich weiß, können Sie kein Array ohne Größe erstellen, aber Sie können es verwenden
und dann
l.ToArray()
.quelle
Kombinieren von @ nawfal & @ Kobi-Vorschlägen:
Anwendungsbeispiel:
UPDATE 2019-05-14
(Dank an @Jaider ty)
Bessere Verwendung der .Net-API:
https://docs.microsoft.com/en-us/dotnet/api/system.array.empty?view=netframework-4.8
Gilt für:
.NET Core: 3.0 Vorschau 5 2.2 2.1 2.0 1.1 1.0
.NET Framework: 4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6
.NET Standard: 2.1 Vorschau 2.0 1.6 1.5 1.4 1.3
...
HTH
quelle
arr = Array.Empty<string>();
Du kannst tun:
Hinweis: OP bedeutete, keine Größe angeben zu müssen und ein Array nicht größenlos zu machen
quelle
specify
Größe zu haben, kein Array zu erstellensizeless
.Hier ist ein Beispiel aus der Praxis. In diesem Fall muss das Array
foundFiles
zuerst auf die Länge Null initialisiert werden .(Wie in anderen Antworten hervorgehoben: Dies initialisiert kein Element und insbesondere kein Element mit dem Index Null, da dies bedeuten würde, dass das Array die Länge 1 hat. Das Array hat nach dieser Zeile die Länge Null!).
Wenn das Teil
= string[0]
weggelassen wird, liegt ein Compilerfehler vor!Dies liegt am Fangblock ohne erneutes Werfen. Der C # -Compiler erkennt den Codepfad, dass die Funktion
Directory.GetFiles()
eine Ausnahme auslösen kann, sodass das Array nicht initialisiert werden kann.Bevor jemand sagt, die Ausnahme nicht erneut auszulösen, wäre eine schlechte Fehlerbehandlung: Dies ist nicht wahr. Die Fehlerbehandlung muss den Anforderungen entsprechen.
In diesem Fall wird davon ausgegangen, dass das Programm im Falle eines nicht lesbaren Verzeichnisses fortgesetzt und nicht unterbrochen werden soll. Das beste Beispiel ist eine Funktion, die eine Verzeichnisstruktur durchläuft. Hier protokolliert die Fehlerbehandlung sie nur. Dies könnte natürlich besser gemacht werden, z. B. das Sammeln aller Verzeichnisse mit fehlgeschlagenen
GetFiles(Dir)
Aufrufen in einer Liste, aber dies wird hier zu weit führen.Es genügt zu sagen, dass das Vermeiden
throw
ein gültiges Szenario ist, und daher muss das Array auf die Länge Null initialisiert werden. Es würde ausreichen, dies im Catch-Block zu tun, aber das wäre ein schlechter Stil.Der Aufruf zum
GetFiles(Dir)
Ändern der Größe des Arrays.quelle