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) ?

Pourquoi « ref » ne peut-il pas être utilisé avec le paramètre « this » dans les méthodes d'extension C# (avant C# 7.2) ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-07 16:41:43309parcourir

Why Can't

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.

refModificateur 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn