C-SHARP - 4.4 ArrayList
Cette vidéo présente une notion à connaître mais à utiliser avec prudence : l'ArrayList. Jusqu'à présent, tableaux et listes nous imposaient un type unique à la déclaration : un List<string> ne stocke que des chaînes. L'ArrayList, au contraire, accepte des éléments de types différents dans une même collection.
Déclarer et remplir une ArrayList
Il faut d'abord ajouter le namespace using System.Collections; en haut du fichier. Ensuite, on peut combiner initialisation entre accolades et méthode Add() :
using System.Collections;
ArrayList liste = new ArrayList() { 18, true, "Bonjour" };
liste.Add(3.14);
for (int i = 0; i < liste.Count; i++)
{
Console.WriteLine(liste[i]);
}
On peut mélanger entiers, booléens, chaînes, doubles… Aucun type n'est imposé à la déclaration. C'est ce qu'on appelle une collection non typée.
Le coût caché : casts et exceptions
Le revers de cette flexibilité : chaque élément récupéré est de type object (le type universel en C#). Pour faire des opérations dessus, il faut caster (forcer la conversion) :
int age = (int)liste[0]; // cast obligatoire
int nouvelAge = (int)liste[0] + 1; // pareil pour les operations
Console.WriteLine("Mon age est : " + age);
Si l'on se trompe d'index et qu'on tente (int)liste[1] alors que la case contient un booléen, la compilation passe mais le programme plante à l'exécution avec une exception de conversion. C'est le piège des collections non typées.
Pourquoi l'éviter
Mixer les types est une mauvaise pratique. Les bugs liés à des mauvaises conversions sont difficiles à reproduire et à diagnostiquer. La majorité des développeurs préfèrent les collections fortement typées : tableaux, List<T>, ou dictionnaires (à venir). Réservez l'ArrayList aux cas vraiment particuliers — la connaître permet surtout de la reconnaître dans du code existant.
En résumé
ArrayList est une collection C# qui permet de stocker des éléments de différents types (int, string, bool, etc.) sans typage strict, contrairement à List<T>. Son utilisation nécessite l'import using System.Collections et oblige à effectuer un cast (conversion) de type à chaque accès à un élément, ce qui crée des risques de confusion et de bugs runtime. Bien que peu recommandée en pratique, cette notion reste importante à connaître au cas où vous la rencontreriez dans des projets existants.
Points clés
- ArrayList permet de mélanger plusieurs types de données (entier, chaîne, booléen) contrairement aux listes typées
- Déclaration via new ArrayList() et initialisation optionnelle avec des accolades contenant les éléments
- Tous les éléments sont stockés en interne comme object, obligeant un cast explicite pour accéder au vrai type
- Accès aux éléments : syntaxe arraylist[index], puis conversion avec (int)arraylist[index] ou autre type
- Peu recommandé en programmation moderne ; source courante de confusion, bugs runtime et pertes de temps
- Risques de InvalidCastException à l'exécution si on tente de convertir un élément au mauvais type
Questions fréquentes
À quoi sert ArrayList par rapport à List<T> ?
ArrayList permet de stocker des éléments de types différents sans spécifier un seul type à la déclaration, tandis que List<T> impose un seul type (List<int>, List<string>, etc.). Cependant, ArrayList est peu recommandé car cette flexibilité crée des risques de bugs difficilement détectables.
Pourquoi faut-il toujours faire un cast pour accéder aux éléments d'un ArrayList ?
Parce que ArrayList stocke en interne tous les éléments comme object (le type de base en C#). Vous devez donc convertir (caster) chaque élément vers son vrai type pour utiliser ses propriétés et opérations (ex: (int)arraylist[0] pour un entier).
Qu'est-ce qu'une exception de casting sur ArrayList ?
Si vous tentez de convertir un élément ArrayList au mauvais type (par exemple convertir un bool en int), le code compilera mais lèvera une exception InvalidCastException à l'exécution, d'où le danger de mélanger les types sans vigilance.