Maison > développement back-end > C++ > Pourquoi l'attribution d'un paramètre de référence à un champ de classe ne conserve-t-elle pas la référence en C# ?

Pourquoi l'attribution d'un paramètre de référence à un champ de classe ne conserve-t-elle pas la référence en C# ?

DDD
Libérer: 2025-01-05 21:42:39
original
599 Les gens l'ont consulté

Why Doesn't Assigning a Reference Parameter to a Class Field Maintain the Reference in C#?

Référencement des champs de classe en C#

En C#, passer un paramètre par référence permet de modifier directement la variable d'origine. Cependant, lors de l'attribution d'un paramètre de référence à un champ de classe, le comportement attendu peut ne pas se produire.

Considérez le code suivant :

public class X
{
    public X()
    {
        string example = "X";

        new Y(ref example);
        new Z(ref example);

        System.Diagnostics.Debug.WriteLine(example);
    }
}

public class Y
{
    public Y(ref string example)
    {
        example += " (Updated By Y)";
    }
}

public class Z
{
    private string _Example;

    public Z(ref string example)
    {
        this._Example = example;
        this._Example += " (Updated By Z)";
    }
}

var x = new X();
Copier après la connexion

Lors de l'exécution, la sortie est "X (mis à jour par Y)", et non "X (mis à jour par Y) (mis à jour par Z)" comme prévu.

En effet, l'attribution d'un paramètre de référence à un champ de classe est interrompue. la référence. Pour conserver la référence, une solution consiste à utiliser un getter et un setter :

sealed class Ref<T>
{
    private readonly Func<T> getter;
    private readonly Action<T> setter;
    public Ref(Func<T> getter, Action<T> setter)
    {
        this.getter = getter;
        this.setter = setter;
    }
    public T Value { get { return getter(); } set { setter(value); } }
}

Ref<int> x;
void M()
{
    int y = 123;
    x = new Ref<int>(() => y, z => { y = z; });
    x.Value = 456;
    Console.WriteLine(y); // 456 -- setting x.Value changes y.
}
Copier après la connexion

Dans cet exemple, 'x' est un objet qui peut obtenir et définir la valeur de 'y', en conservant la référence entre eux. Notez que même si les méthodes de référence locale et de retour de référence sont prises en charge dans le CLR, elles ne sont pas encore disponibles en C#.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal