En C#, le mot-clé this est une référence à l'instance actuelle de la classe ou de la structure dans laquelle il est utilisé. Il offre plusieurs fonctionnalités essentielles pour la programmation orientée objet, notamment l'accès aux membres de l'objet, le chaînage des constructeurs, l'implémentation d'indexeurs et la création de méthodes d'extension. Comprendre ses diverses applications est fondamental pour écrire du code C# robuste et maintenable.
- Accès aux Membres de l'Instance Courante
L'utilisation la plus directe du mot-clé this est de lever toute ambiguïté lors de l'accès aux membres d'une classe lorsque les noms des paramètres d'une méthode ou d'un constructeur sont identiques aux noms des champs ou propriétés de la classe. Il permet de clairement indiquer que l'on fait référence au membre de l'instance et non au paramètre local.
namespace ExplorationThis
{
internal class ProgrammePrincipal
{
static void Main(string[] args)
{
RessourceWeb maPage = new RessourceWeb("Mon Super Site", "https://example.com/monsupersite");
maPage.AfficherDetails();
Console.ReadKey();
}
}
public class RessourceWeb
{
private string nomSite;
private string urlSite;
// Constructeur qui utilise 'this' pour différencier les paramètres des champs
public RessourceWeb(string nomSite, string urlSite)
{
this.nomSite = nomSite; // Fait référence au champ de l'instance
this.urlSite = urlSite; // Fait référence au champ de l'instance
}
public void AfficherDetails()
{
Console.WriteLine($"Nom du site : {this.nomSite}, URL : {this.urlSite}");
}
}
}
- Chaînage de Constructeurs
Le mot-clé this peut également être utilisé pour appeler un autre constructeur de la même classe à partir d'un constructeur existant. Cette pratique est particulièrement utile pour éviter la répétition de code et centraliser la logique d'initialisation commune partagée par plusieurs constructeurs.
namespace ExplorationThis
{
internal class ProgrammePrincipal
{
static void Main(string[] args)
{
GestionnaireMessages gestionnaire = new GestionnaireMessages("Message Initial");
Console.ReadKey();
}
}
public class GestionnaireMessages
{
// Constructeur sans paramètres
public GestionnaireMessages()
{
Console.WriteLine("Constructeur par défaut exécuté.");
}
// Constructeur avec un paramètre, qui appelle le constructeur par défaut
public GestionnaireMessages(string message) : this()
{
Console.WriteLine($"Message reçu : {message}");
Console.WriteLine("Constructeur paramétré exécuté.");
}
}
}
- Définition d'Indexeurs
Les indexeurs permettent aux instances d'une classe ou d'une structure d'être accédées comme si elles étaient des tableaux. Le mot-clé this est utilisé pour définir la signature de l'indexeur, indiquant que l'accès par index s'appplique à l'instance courante de l'objet, agissant comme un "accès par défaut".
namespace ExplorationThis
{
internal class ProgrammePrincipal
{
static void Main(string[] args)
{
CollectionNumerique collection = new CollectionNumerique();
Console.WriteLine($"Première valeur: {collection[0]}, Deuxième valeur: {collection[1]}");
collection[0] = 100;
collection[1] = 200;
Console.WriteLine($"Nouvelle première valeur: {collection[0]}, Nouvelle deuxième valeur: {collection[1]}");
Console.ReadKey();
}
}
public class CollectionNumerique
{
private int valeurPrincipale;
private int valeurSecondaire;
// Définition de l'indexeur pour la classe
public int this[int index]
{
get
{
if (index == 0)
return valeurPrincipale;
else if (index == 1)
return valeurSecondaire;
else
throw new IndexOutOfRangeException("L'index doit être 0 ou 1.");
}
set
{
if (index == 0)
valeurPrincipale = value;
else if (index == 1)
valeurSecondaire = value;
else
throw new IndexOutOfRangeException("L'index doit être 0 ou 1.");
}
}
}
}
- Création de Méthodes d'Extension
Les méthodes d'extension offrent la possibilité d'ajouter de nouvelles fonctionnalités à des types existants sans altérer leur code source original ou créer de nouveaux types dérivés. Le premier paramètre d'une méthode d'extension doit être précédé du mot-clé this, indiquant clairement le type que la méthode est destinée à étendre.
namespace ExplorationThis
{
internal class ProgrammePrincipal
{
static void Main(string[] args)
{
string texteInitial = "Bonjour le monde";
string texteEnrichi = texteInitial.AjouterSuffixe("!");
Console.WriteLine(texteEnrichi);
int nombre = 5;
Console.WriteLine($"Le nombre {nombre} est pair : {nombre.EstPair()}");
Console.ReadKey();
}
}
// Une classe statique est nécessaire pour contenir les méthodes d'extension
public static class ExtensionsDeChaine
{
// Méthode d'extension pour le type string
public static string AjouterSuffixe(this string source, string suffixe)
{
return source + suffixe;
}
}
public static class ExtensionsNumeriques
{
// Méthode d'extension pour le type int
public static bool EstPair(this int nombre)
{
return nombre % 2 == 0;
}
}
}