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 auch ohne die Größe erstellen?
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 auch ohne die Größe erstellen?
Können Sie die Array.Empty Methode (zumindest in .Net Core)
string ToCsv(int[] myArr = null) { // null by default
// affect an empty array if the myArr is null
myArr ??= Array.Empty<int>();
//... do stuff
string csv = string.Join(",", myArr);
return csv;
}
Kombination der Vorschläge von @nawfal und @Kobi:
namespace Extensions
{
/// <summary> Useful in number of places that return an empty byte array to avoid unnecessary memory allocation. </summary>
public static class Array<T>
{
public static readonly T[] Empty = new T[0];
}
}
使用例
Array<string>.Empty
UPDATE 2019-05-14
(Dank an @Jaider ty)
Verwenden Sie besser .Net API:
public static T[] Empty<T> ();
https://learn.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
Hier ist ein Beispiel aus der Praxis. In diesem ist es notwendig, das Array zu initialisieren foundFiles
zunächst auf Null Länge.
(Wie in anderen Antworten hervorgehoben: Es wird kein Element initialisiert und schon gar nicht ein Element mit dem Index Null, denn das würde bedeuten, dass das Array die Länge 1 hätte. Das Array hat nach dieser Zeile die Länge Null).
Wenn das Teil = string[0]
weggelassen wird, gibt es einen Compilerfehler!
Der Grund dafür ist der Fangblock ohne Rückwurf. Der C#-Compiler erkennt den Code-Pfad, dass die Funktion Directory.GetFiles()
kann eine Exception auslösen, so dass das Array uninitialisiert sein könnte.
Bevor jemand sagt, die Ausnahme nicht erneut auszulösen, wäre eine schlechte Fehlerbehandlung: Das ist nicht wahr. Die Fehlerbehandlung muss zu den Anforderungen passen.
In diesem Fall wird davon ausgegangen, dass das Programm im Falle eines nicht lesbaren Verzeichnisses weiterläuft und nicht abbricht - das beste Beispiel ist eine Funktion, die eine Verzeichnisstruktur durchläuft. Hier besteht die Fehlerbehandlung nur darin, den Fehler zu protokollieren. Natürlich könnte man das noch besser machen, z.B. alle Verzeichnisse mit fehlgeschlagenen GetFiles(Dir)
Aufrufe in einer Liste, aber das führt hier zu weit.
Es genügt die Feststellung, dass die Vermeidung von throw
ist ein gültiges Szenario, und daher muss das Array mit der Länge Null initialisiert werden. Es würde reichen, dies im catch-Block zu tun, aber das wäre schlechter Stil.
Die Aufforderung an GetFiles(Dir)
ändert die Größe des Arrays.
string[] foundFiles= new string[0];
string dir = @"c:\";
try
{
foundFiles = Directory.GetFiles(dir); // Remark; Array is resized from length zero
}
// Please add appropriate Exception handling yourself
catch (IOException)
{
Console.WriteLine("Log: Warning! IOException while reading directory: " + dir);
// throw; // This would throw Exception to caller and avoid compiler error
}
foreach (string filename in foundFiles)
Console.WriteLine("Filename: " + filename);
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.