Implémentation d'indexeurs en C #
Les indexeurs permettent d'indexer les instances d'une classe comme les tableaux, et sont déclarés de la même façon que les méthodes. Ils peuvent être utiles lorsque vous travaillez avec votre propre classe de collection. Apprenons à définir et à utiliser des indexeurs.
Vous pouvez être amené à accéder aux données de vos types personnalisés comme un tableau, à l'aide de l'opérateur d'index, []
. Cette fonctionnalité peut être utile lors de la création de classes génériques personnalisées. Un indexeur permet d'indexer un objet, tel qu'un tableau, et de définir ou d'extraire la valeur indexée sans spécifier explicitement un type ou un membre d'instance.
Pour déclarer un indexeur d'une classe, vous ajoutez une propriété légèrement différente avec le ce []
mot-clé et les arguments de tout type entre crochets. Les propriétés renvoient ou définissent un membre de données spécifique, tandis que les indexeurs renvoient ou définissent une valeur particulière à partir de l'instance d'objet.
Voyons un exemple pour voir comment implémenter un indexeur.
class User
{
chaîne publique Nom {get; ensemble; }
chaîne publique Email {get; ensemble; }
}
classe UserCollection
{
ArrayList users = new ArrayList ();
Utilisateur public this [int index]
{
get => (utilisateur) utilisateurs [index];
set => users.Insert (index, valeur);
}
public int Count => users.Count;
}
Nous avons défini ci-dessus un indexeur dont le paramètre est un type int. Nous avons utilisé la classe ArrayList
pour contenir une collection d'objets User
et avons utilisé son indexeur pour extraire et stocker des utilisateurs en fonction de la valeur transmise. Voici comment utiliser l'indexeur:
var users = new UserCollection ();
// ajouter des objets en utilisant l'indexeur
utilisateurs [0] = nouvel utilisateur ("Julie Lerman", "joelin@indo.com");
utilisateurs [1] = nouvel utilisateur ("Mark Lettuce", "mark@lettuce.com");
utilisateurs [2] = nouvel utilisateur ("Peter Mbanugo", "p.mbanugo@yahoo.com");
// obtenir et afficher chaque élément à l'aide de l'indexeur
pour (int i = 0; i <utilisateurs.Compte; i ++)
{
Console.WriteLine ("Numéro d'utilisateur: {0}", i);
Console.WriteLine ("Nom: {0}", utilisateurs [i] .Name);
Console.WriteLine ("Email: {0}", utilisateurs [i] .Email);
Console.WriteLine ();
}
// sortie
// numéro d'utilisateur: 0
// Nom: Julie Lerman
// Email: joelin@indo.com
// numéro d'utilisateur: 1
// Nom: Mark Lettuce
// Email: mark@lettuce.com
// numéro d'utilisateur: 2
// Nom: Peter Mbanugo
// Email: p.mbanugo@yahoo.com
Comme vous pouvez le voir dans l'exemple ci-dessus, l'utilisation de l'indexeur est similaire à celle que vous utilisiez déjà avec les indexeurs dans .NET.
Indexing Using String
Nous avons utilisé des entiers pour l'indexation dans l'exemple précédent, mais vous pouvez également utiliser tout autre type en tant qu'argument pour l'indexeur. Mettons à jour l'implémentation de UserCollection
pour utiliser un type d'argument de chaîne pour la méthode d'indexation.
class UserCollection
{
Dictionary users = new Dictionary ();
Utilisateur public this [string name]
{
get => (utilisateur) utilisateurs [name];
set => users [name] = valeur;
}
}
// utilisation de l'indexeur
static void Main (string [] args)
{
var users = new UserCollection ();
// ajouter des objets en utilisant l'indexeur
utilisateurs ["julie"] = nouvel utilisateur ("Julie Lerman", "joelin@indo.com");
utilisateurs ["mark"] = nouvel utilisateur ("Mark Lettuce", "mark@lettuce.com");
utilisateurs ["peter"] = nouvel utilisateur ("Peter Mbanugo", "p.mbanugo@yahoo.com");
// obtenir et afficher les données de Mark
Console.WriteLine ($ "Marques Email: {utilisateurs ["mark"] .Email}");
Console.Read ();
}
L'implémentation utilise maintenant un dictionnaire pour contenir la liste des utilisateurs car il nous permet de stocker des données avec des clés de tout type. Avec cela, vous pouvez ajouter et récupérer des objets utilisateur avec une valeur de chaîne lorsque vous utilisez l'indexeur. Lorsque vous exécutez le code, il doit générer le message de Mark: mark@lettuce.com
sur la console
Overloading Indexers
Les méthodes d'indexation peuvent également être surchargées. Si vous vous trouvez dans une situation où vous souhaitez accéder aux éléments à l'aide d'une valeur numérique ou d'une valeur de chaîne, vous pouvez définir plusieurs méthodes d'indexation pour ce type, ce qui entraîne des indexeurs surchargés. Dans la suite de notre exemple de la section précédente, mettons à jour UserCollection
pour y inclure un indexeur numérique et un autre qui accepte le type de valeur chaîne:
class UserCollection
{
Dictionary users = new Dictionary ();
Utilisateur public this [string name]
{
get => (utilisateur) utilisateurs [name];
set => users [name] = valeur;
}
Utilisateur public this [int key]
{
get => (utilisateur) utilisateurs [key.ToString()];
set => users [key.ToString()] = valeur;
}
public int Count => users.Count;
}
Les méthodes d'indexation pour le UserCollection
comportent deux surcharges: une qui prend un entier et une autre qui prend une valeur de chaîne. Vous pouvez avoir autant de surcharges que vous le souhaitez, comme vous le feriez pour les méthodes que vous définissez dans vos classes. Le code ci-dessous montre un exemple d'utilisation des deux indexeurs définis dans UserCollection
.
var users = new UserCollection ();
// ajouter des objets en utilisant l'indexeur
utilisateurs ["julie"] = nouvel utilisateur ("Julie Lerman", "joelin@indo.com");
utilisateurs ["mark"] = nouvel utilisateur ("Mark Lettuce", "mark@lettuce.com");
utilisateurs [3] = nouvel utilisateur ("Peter Mbanugo", "p.mbanugo@yahoo.com");
utilisateurs [3] = nouvel utilisateur ("Peter Liko", "liko@jordan.com");
Console.WriteLine ($ "{utilisateurs [3] .Name} - {utilisateurs [3] .Email}");
Console.Read ();
// sortie
// Peter Liko - liko@jordan.com
Notez que, d'après le code ci-dessus, vous pouvez utiliser une chaîne ou un entier comme types de paramètres pour les méthodes d'indexation. Il montrait deux assignations utilisant la valeur entière, 3
. La deuxième assignation remplace l'assignation initiale et l'appel de l'accesseur get
renverra la dernière valeur définie pour les utilisateurs [3]
qui devrait être Peter Liko - liko@jordan.com
.
C'est une conclusion
Les indexeurs sont similaires aux propriétés, mais sont accessibles via un argument d'index plutôt qu'un nom de propriété. Vous les définissez de la même manière que vous définissez les propriétés, mais en utilisant la syntaxe this []
. Je vous ai montré comment le déclarer avec des exemples montrant comment utiliser des méthodes d'indexation surchargées et comment les utiliser.
Les commentaires sont désactivés en mode Aperçu.
Source link