Maison >développement back-end >C++ >Pourquoi « ref » ne peut-il pas être utilisé avec le paramètre « this » dans les méthodes d'extension C# (avant C# 7.2) ?
Méthodes d'extension C# et modificateur "ref" : comprendre la nuance du paramètre "this"
Les méthodes d'extension C# améliorent les types existants avec de nouvelles fonctionnalités sans altérer leur code d'origine. Cependant, une différence clé apparaît lors de l'utilisation du modificateur ref
avec le paramètre this
, notamment concernant son impact sur l'instance en cours d'extension.
ref
Modificateur dans les arguments de la méthode d'extension
Les méthodes d'extension peuvent accepter des arguments modifiés par ref
, permettant de modifier les valeurs d'origine. Considérez :
<code class="language-csharp">public static void Modify(ref int x, int y) { x = y; }</code>
Ceci est valide car ref
modifie un paramètre régulier.
La restriction sur ref this
La restriction survient lors de l'application de ref
au paramètre this
:
<code class="language-csharp">public static void ModifyExtension(this ref int x, int y) { x = y; } //Compiler Error</code>
Cela génère une erreur du compilateur.
Contexte historique (Pré-C# 7.2)
Avant C# 7.2, cette limitation provenait des contraintes du compilateur. Le compilateur a géré le paramètre this
différemment, empêchant la sémantique ref
.
C# 7.2 et au-delà : activation ref this
C# 7.2 a résolu cette limitation. Désormais, ref
peut être utilisé avec le paramètre this
, particulièrement utile pour modifier les types de valeur (structs).
Application pratique : Modification des structures
Cette fonctionnalité s'avère inestimable lorsque vous travaillez avec des structures, permettant des modifications sur place dans les méthodes d'extension. Par exemple :
<code class="language-csharp">public struct MyData { public string Value { get; set; } } public static class MyDataExtensions { public static void UpdateValue(this ref MyData data, string newValue) { data.Value = newValue; } }</code>
Ici, UpdateValue
modifie directement la propriété Value
de la structure MyData
. Cela évite la création d'une nouvelle instance de structure, améliorant ainsi les performances.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!