Maison >développement back-end >C++ >Pourquoi les champs de classe C# ne peuvent-ils pas être attribués par référence et comment contourner ce problème ?

Pourquoi les champs de classe C# ne peuvent-ils pas être attribués par référence et comment contourner ce problème ?

DDD
DDDoriginal
2025-01-05 22:01:42363parcourir

Why Can't C# Class Fields Be Assigned by Reference, and How Can This Be Worked Around?

Conserver les références lors de l'affectation à un champ

En C#, l'affectation par "référence" à un champ de classe n'est pas possible. En effet, les champs ne peuvent pas être de type référence. Il y a trois raisons principales à cela :

Raisons de la restriction :

  1. Champs de référence non sécurisés : Autoriser les champs de référence ouvrirait la possibilité de créer des « bombes à retardement » dans le code. Supposons que vous attribuiez un champ ref à une variable locale qui pourrait devenir invalide une fois la méthode terminée, entraînant des plantages potentiels.
  2. Pool de stockage temporaire : Les variables locales sont généralement stockées dans un pool de mémoire temporaire. pour optimiser les performances. Autoriser les champs ref nécessiterait l'utilisation du tas récupéré, ce qui est moins efficace.

Solution de contournement :

Malgré la restriction, il existe une solution de contournement pour simuler comportement de type référence :

Utiliser un délégué et Action :

Créez un délégué avec un getter et un setter pour la valeur souhaitée. Stockez ce délégué dans un champ au lieu d'une réf. Par exemple :

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
}

Dans ce cas, x stocke un délégué qui peut obtenir et définir la valeur de y. Lorsque vous définissez x.Value, cela modifie y.

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