Maison >développement back-end >C++ >Pourquoi C# n'autorise-t-il pas les champs à contenir des références et quelles sont les alternatives ?

Pourquoi C# n'autorise-t-il pas les champs à contenir des références et quelles sont les alternatives ?

DDD
DDDoriginal
2025-01-06 03:12:39691parcourir

Why Doesn't C# Allow Fields to Hold References, and What Are the Alternatives?

Affectations de référence dans les champs de classe C#

En C#, tenter d'attribuer par « référence » à un champ de classe peut entraîner un comportement inattendu. 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();

Le résultat attendu est "X (Updated By Y) (Updated By Z)", mais à la place, seul "X (Updated By Y)" est imprimé. Ce comportement se produit car l'attribution d'un "paramètre ref" à un champ perd la référence.

Pourquoi les champs ne peuvent-ils pas contenir de références ?

Il n'y a que trois options possibles lorsque en considérant les champs de "type ref":

  1. Interdire les champs de type ref : C'est le comportement actuel en C#.
  2. Autoriser les champs non sécurisés de type ref : Cela permettrait la possibilité d'accéder à une mémoire non sécurisée, conduisant potentiellement à un comportement imprévisible.
  3. Stocker local variables en dehors de la pile : Cela empêcherait l'optimisation du stockage des variables locales dans un pool de mémoire temporaire, ce qui n'est pas le cas souhaitable.

L'option 1 a été choisie pour garantir la stabilité du programme et empêcher la création de bombes à retardement dans le code.

Comment obtenir un comportement de référence

Bien que vous ne puissiez pas avoir de champs de type ref, il existe d'autres moyens d'obtenir des champs de type référence. behavior :

  • Création d'une classe qui encapsule la référence : Vous pouvez créer une classe qui fournit des méthodes getter et setter pour accéder et modifier la variable référencée. Il s'agit d'une manière indirecte de référencer une autre variable.
  • Utilisation des fonctionnalités de C# 7 (Ref Locals et Ref Returning Methods) : Bien que C# ne prenne pas en charge le stockage de références dans des champs, il prend en charge les ref locales. et référence méthodes de retour. Cela vous permet de créer des variables de référence qui peuvent être transmises par référence et modifiées par plusieurs méthodes.

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