Comment initialiser un tableau vide dans C#?
est-il possible de créer un tableau vide sans spécifier la taille?
par exemple, j'ai créé:
String[] a = new String[5];
pouvons-nous créer le tableau de cordes ci-dessus sans la taille?
12 réponses
Si vous allez utiliser une collection que vous ne connaissez pas la taille de l'avance, il ya de meilleures options que les tableaux.
utilisez un List<string>
à la place - il vous permettra d'ajouter autant d'éléments que vous avez besoin et si vous avez besoin de retourner un tableau, appelez ToArray()
sur la variable.
var listOfStrings = new List<string>();
// do stuff...
string[] arrayOfStrings = listOfStrings.ToArray();
si vous devez créer un tableau vide vous pouvez faire ceci:
string[] emptyStringArray = new string[0];
dans .Net 4.6 la méthode préférée est d'utiliser une nouvelle méthode, Array.Empty
:
String[] a = Array.Empty<string>();
Le mise en œuvre est succincte, à l'aide de comment les membres statiques de classes génériques se comporter .Net :
public static T[] Empty<T>()
{
return EmptyArray<T>.Value;
}
// Useful in number of places that return an empty byte array to avoid
// unnecessary memory allocation.
internal static class EmptyArray<T>
{
public static readonly T[] Value = new T[0];
}
(le code du contrat a été supprimé pour plus de clarté)
voir aussi:
-
Array.Empty
code source sur la Source de référence - Introduction à
Array.Empty<T>()
- Marc Gravel - Allocaction, l'Allocation, l'Allocation - mon poste préféré sur minuscule allocations.
vous pouvez l'initialiser avec une taille de 0, mais vous devrez le réinitialiser, quand vous savez quelle est la taille, car vous ne pouvez pas l'ajouter au tableau.
string[] a = new string[0];
il n'y a pas beaucoup d'intérêt à déclarer un tableau Sans Taille. Un tableau est d'environ la taille . Lorsque vous déclarez un tableau de taille spécifique, vous spécifiez le nombre fixe de fentes disponibles dans une collection qui peut contenir des choses, et en conséquence la mémoire est allouée. Pour y ajouter quelque chose, vous devrez de toute façon réinitialiser le tableau existant (même si vous redimensionnez le tableau, voir ce thread ). L'un des rares cas où vous voulez initialiser un tableau vide serait de passer de tableau comme argument.
si vous voulez définir une collection quand vous ne savez pas quelle taille il pourrait être éventuellement, tableau n'est pas votre choix, mais quelque chose comme un List<T>
ou similaire.
cela dit, la seule façon de déclarer un tableau sans spécifier la taille est d'avoir un tableau vide de taille 0 . hemant et Alex Dn offre deux façons. Une autre alternative plus simple est juste :
string[] a = { };
[ les éléments à l'intérieur du support doivent être implicitement convertibles en un type défini, par exemple, string[] a = { "a", "b" };
]
Ou encore une autre:
var a = Enumerable.Empty<string>().ToArray();
Voici une façon plus déclarative :
public static class Array<T>
{
public static T[] Empty()
{
return Empty(0);
}
public static T[] Empty(int size)
{
return new T[size];
}
}
Maintenant vous pouvez appel:
var a = Array<string>.Empty();
//or
var a = Array<string>.Empty(5);
Vous pouvez le faire:
string[] a = { String.Empty };
Note: OP signifie Ne pas avoir à spécifier une taille, ne pas faire un tableau sizeless
vous pouvez définir la taille du tableau à l'exécution .
cela vous permettra de faire n'importe quoi pour calculer dynamiquement la taille du tableau. Mais, une fois définie la taille est immuable.
Array a = Array.CreateInstance(typeof(string), 5);
j'avais essayé:
string[] sample = new string[0];
mais je n'ai pu y insérer qu'une seule chaîne, et j'ai eu une exception sans erreur, donc j'ai simplement mis une taille pour ça, comme
string[] sample = new string[100];
Ou une autre manière de travailler pour moi:
List<string> sample = new List<string>();
attribuer une Valeur pour la liste:
sample.Add(your input);
comme je sais que vous ne pouvez pas faire tableau sans taille, mais vous pouvez utiliser""
List<string> l = new List<string>()
puis l.ToArray()
.
Combining @nawfal & @Kobi suggestions:
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];
}
}
exemple d'utilisation:
Array<string>.Empty
HTH
Voici un exemple réel. En cela, il est nécessaire d'initialiser le tableau foundFiles
première longueur zéro.
(comme souligné dans d'autres réponses: ceci initialise pas un élément et surtout pas un élément avec index zéro parce que cela signifierait que le tableau avait la longueur 1. Le tableau a une longueur zéro après cette ligne!).
si la partie = string[0]
est omise, il y a une erreur de compilation!
C'est à cause de le catch block sans rethrow. Le compilateur C # reconnaît le chemin de code, que la fonction Directory.GetFiles()
peut lancer une Exception, de sorte que le tableau pourrait être uninitialisé.
avant que quelqu'un ne dise, ne pas repenser l'exception serait une mauvaise gestion des erreurs: ce n'est pas vrai. Le traitement des erreurs doit être adapté aux exigences.
dans ce cas, il est supposé que le programme devrait continuer dans le cas d'un répertoire qui ne peut pas être lu, et ne pas casser - le meilleur exemple: une fonction traversant une structure de répertoire. Ici, la gestion des erreurs n'est qu'une journalisation. Bien sûr, cela pourrait être mieux fait, par exemple en collectant tous les répertoires avec des appels GetFiles(Dir)
manqués dans une liste, mais cela mènera trop loin ici.
il suffit de déclarer qu'éviter throw
est un scénario valide, et donc le tableau doit être initialisé à la longueur zéro. Il suffirait pour ce faire, dans le bloc catch, mais ce serait mauvais style.
l'appel à GetFiles(Dir)
redimensionne le tableau.
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);