Comment initialiser un tableau vide en C #?

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

Par exemple, j’ai créé:

Ssortingng[] a = new Ssortingng[5]; 

Peut-on créer le tableau ci-dessus sans la taille?

Si vous envisagez d’utiliser une collection dont vous ne connaissez pas la taille, il existe de meilleures options que les tableaux.

Utilisez plutôt une List – cela vous permettra d’append autant d’éléments que nécessaire et si vous avez besoin de retourner un tableau, appelez ToArray() sur la variable.

 var listOfSsortingngs = new List(); // do stuff... ssortingng[] arrayOfSsortingngs = listOfSsortingngs.ToArray(); 

Si vous devez créer un tableau vide, vous pouvez le faire:

 ssortingng[] emptySsortingngArray = new ssortingng[0]; 

Essaye ça:

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

Dans .Net 4.6, la méthode préférée consiste à utiliser une nouvelle méthode, Array.Empty :

 Ssortingng[] a = Array.Empty(); 

L’ implémentation est succincte, en utilisant le comportement des membres statiques des classes génériques dans .Net :

 public static T[] Empty() { return EmptyArray.Value; } // Useful in number of places that return an empty byte array to avoid // unnecessary memory allocation. internal static class EmptyArray { public static readonly T[] Value = new T[0]; } 

(code de contrat lié au contrat supprimé pour plus de clarté)

Voir également:

  • Array.Empty source Array.Empty source de référence
  • Introduction à Array.Empty()
  • Marc Gravell – Allocaction, Allocation, Allocation – mon post préféré sur les petites allocations cachées.

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

 ssortingng[] a = new ssortingng[0]; 

Il ne sert à rien de 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 pouvant contenir des éléments, et en conséquence, de la mémoire est allouée. Pour append quelque chose, vous devrez de toute façon réinitialiser le tableau existant (même si vous redimensionnez le tableau, voir ce sujet ). Un des rares cas où vous voudriez initialiser un tableau vide serait de passer le tableau en argument.

Si vous voulez définir une collection lorsque vous ne savez pas de quelle taille il pourrait s’agir, array n’est pas votre choix, mais quelque chose comme une List 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 proposent deux solutions. Une autre alternative plus simple consiste à :

 ssortingng[] a = { }; 

[ Les éléments à l’intérieur du crochet devraient être implicitement convertibles en type défini, par exemple, ssortingng[] a = { "a", "b" }; ]

Ou encore un autre:

 var a = Enumerable.Empty().ToArray(); 

Voici une manière plus déclarative :

 public static class Array { public static T[] Empty() { return Empty(0); } public static T[] Empty(int size) { return new T[size]; } } 

Maintenant, vous pouvez appeler:

 var a = Array.Empty(); //or var a = Array.Empty(5); 

Tu peux faire:

 ssortingng[] a = { Ssortingng.Empty }; 

Note: OP signifiait ne pas avoir à spécifier une taille, ne pas rendre un tableau sans taille

Vous pouvez définir la taille du tableau lors de l’exécution .

Cela vous permettra de faire tout ce qui est nécessaire pour calculer dynamicment la taille du tableau. Mais, une fois définie, la taille est immuable.

 Array a = Array.CreateInstance(typeof(ssortingng), 5); 

Comme je sais que vous ne pouvez pas créer de tableau sans taille, mais vous pouvez utiliser

 List l = new List() 

puis l.ToArray() .

Simple et élégant!

 ssortingng[] array = {} 

J’avais essayé:

 ssortingng[] sample = new ssortingng[0]; 

Mais je ne pouvais y insérer qu’une chaîne, puis j’ai eu une erreur exceptionOutOfBound, donc je lui ai simplement mis une taille, comme

 ssortingng[] sample = new ssortingng[100]; 

Ou une autre façon qui fonctionne pour moi:

 List sample = new List(); 

Affecter une valeur à la liste:

 sample.Add(your input); 

Combiner les suggestions @nawfal et @Kobi:

 namespace Extensions { ///  Useful in number of places that return an empty byte array to avoid unnecessary memory allocation.  public static class Array { public static readonly T[] Empty = new T[0]; } } 

Exemple d’utilisation:

 Array.Empty 

HTH

Voici un exemple du monde réel. En cela, il est nécessaire d’initialiser le tableau foundFiles abord à la longueur zéro.

(Comme souligné dans d’autres réponses: Ceci initialise pas un élément et surtout pas un élément avec l’index zéro car cela voudrait dire que le tableau avait la longueur 1. Le tableau a la longueur zéro après cette ligne!).

Si la partie = ssortingng[0] est omise, il y a une erreur de compilation!

C’est à cause du bloc catch sans ré-interroger. Le compilateur C # reconnaît le chemin de code, que la fonction Directory.GetFiles() peut générer une exception, afin que le tableau puisse être non initialisé.

Avant que quelqu’un dise, ne pas renvoyer l’exception serait une mauvaise gestion des erreurs: ce n’est pas vrai. La gestion des erreurs doit correspondre 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 se casser. Le meilleur exemple est une fonction traversant une structure de répertoire. Ici, le traitement des erreurs ne fait que le connecter. Bien sûr, cela pourrait être mieux fait, par exemple en collectant tous les répertoires avec des GetFiles(Dir) dans une liste, mais cela mènerait trop loin ici.

Il suffit d’indiquer que le fait d’éviter le throw est un scénario valide et que le tableau doit être initialisé à la longueur zéro. Il suffirait de le faire dans le bloc catch, mais ce serait un mauvais style.

L’appel à GetFiles(Dir) redimensionne le tableau.

 ssortingng[] foundFiles= new ssortingng[0]; ssortingng 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 comstackr error } foreach (ssortingng filename in foundFiles) Console.WriteLine("Filename: " + filename);