373 votes

Comment initialiser un tableau vide en C# ?

Est-il possible de créer un tableau vide sans en spécifier la taille ?

Par exemple, j'ai créé :

String[] a = new String[5];

Peut-on créer le tableau de chaînes ci-dessus sans la taille ?

2 votes

stackoverflow.com/questions/151936/ Vérifiez ce lien, il peut vous aider à comprendre clairement les choses.

4 votes

486voto

Oded Points 271275

Si vous devez utiliser une collection dont vous ne connaissez pas la taille à l'avance, il existe de meilleures options que les tableaux.

Utilisez un List<string> à la place - il vous permettra d'ajouter autant d'éléments que vous le souhaitez 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 doit créer un tableau vide, vous pouvez le faire :

string[] emptyStringArray = new string[0];

3 votes

@Oded -- string[] emptyStringArray = new string[0] ; ne donne pas un tableau vide, n'est-ce pas ? On dirait que c'est un tableau avec un élément où cet élément est nul.

18 votes

@roryap - Non. Il en résulte un string[] qui n'a pas d'éléments. Si vous essayez d'accéder à emptyStringArray[0] vous obtiendrez un IndexOutOfRangeException

0 votes

@Oded -- Merci, je suis assez nouveau en C#. En VB, l'indice fourni est la borne supérieure, et non le nombre d'éléments.

198voto

hemant Points 512

Essayez ça :

string[] a = new string[] { };

7 votes

En développant cette réponse, vous pouvez également initialiser le tableau avec des éléments sans spécifier la taille OU le type, le compilateur déduira l'un ou l'autre à partir de l'initialisateur : var a = new []{"a", "b", "c"} ; Il s'agit toujours d'un tableau de chaînes fortement typé.

1 votes

Exception non gérée : System.IndexOutOfRangeException : Index was outside the boun ds of the array. at ArrayClass.Main(String[] args). J'ai rencontré cette erreur après avoir modifié mon int[] variable = new int[]{}

8 votes

@yogesh : C'est étrange. Quand on écrit par exemple int[] variable = new int[]{} et l'utiliser par exemple dans une boucle telle que foreach (var s in variable){ Console.WriteLine(s);} le code est compilé : int[] args1 = new int[0]; et foreach (int num in args1){Console.WriteLine(num);} . Il ne devrait donc y avoir aucune différence entre l'utilisation de new int[0] et new int[]{} car les deux sont compilés dans le même code.

35voto

MatthiasG Points 2755

Vous pourriez l'initialiser avec une taille de 0, mais vous devrez le réinitialiser, lorsque vous connaîtrez la taille, car vous ne pouvez pas ajouter au tableau.

string[] a = new string[0];

0 votes

Voici la réponse exacte

9voto

nawfal Points 13500

Il n'y a pas beaucoup d'intérêt à déclarer un tableau sans taille. Un tableau concerne la taille . Lorsque vous déclarez un tableau de taille spécifique, vous spécifiez le nombre fixe d'emplacements disponibles dans une collection qui peut contenir des choses, et la mémoire est allouée en conséquence. 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 fil de discussion ). L'un des rares cas où vous voudriez initialiser un tableau vide serait de passer array comme argument.

Si vous voulez définir une collection alors que vous ne savez pas quelle taille elle peut avoir, le tableau n'est pas votre choix, mais quelque chose comme une List<T> ou similaire.

Cela dit, la seule façon de déclarer un tableau sans spécifier sa taille est d'avoir un tableau vide de taille 0 . hemant et Alex Dn offre deux possibilités. Une autre alternative plus simple consiste à simplement :

string[] a = { };

[ Les éléments à l'intérieur de la parenthèse doivent être implicitement convertibles en type défini, par exemple, string[] a = { "a", "b" }; ]

Ou encore une autre :

var a = Enumerable.Empty<string>().ToArray();

Voici une méthode 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 appeler :

var a = Array<string>.Empty();

//or

var a = Array<string>.Empty(5);

1 votes

Je n'en vois pas l'utilité, sauf lorsque vous devez passer un tableau en paramètre. Il y a quelques cas dans la réflexion où une méthode accepte un tableau d'objets et vous pourriez vouloir passer un tableau vide pour effectuer une action par défaut. Je vais modifier ma réponse.

0 votes

Vous avez par exemple une interface implémentée par plusieurs classes qui renvoient un IEnumerable et l'une des implémentations n'a pas d'éléments pour la méthode et renvoie un tableau vide par exemple.

0 votes

@IgnacioSolerGarcia Je renverrais un tableau dans ce cas si et seulement si c'est une application extrêmement critique en termes de performances. Je dirai que les tableaux sont dépassés et devraient être évités si vous le pouvez. Voir ce par Lippert et cette question de S.O.

1voto

Alex Dn Points 2087

Comme je le sais, vous ne pouvez pas faire de tableau sans taille, mais vous pouvez utiliser

List<string> l = new List<string>() 

et ensuite l.ToArray() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X