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.