Maison > développement back-end > C++ > Comment puis-je transmettre efficacement des propriétés par référence en C# ?

Comment puis-je transmettre efficacement des propriétés par référence en C# ?

Patricia Arquette
Libérer: 2025-01-11 08:54:42
original
449 Les gens l'ont consulté

How Can I Effectively Pass Properties by Reference in C#?

Passer des propriétés par référence en C#

Transmettre des propriétés par référence en C# n'est pas trivial car les propriétés n'exposent pas de références à leurs champs de support. Il existe cependant des moyens d’obtenir un comportement similaire.

1. Valeur de retour :

Cette méthode renvoie la valeur d'entrée si elle n'est pas nulle ou vide, sinon renvoie la valeur de la propriété d'origine.

string GetString(string input, string output)
{
    if (!string.IsNullOrEmpty(input))
    {
        return input;
    }
    return output;
}

void Main()
{
    var person = new Person();
    person.Name = GetString("test", person.Name);
    Debug.Assert(person.Name == "test");
}
Copier après la connexion

2. Délégué :

À l'aide de délégués, les valeurs d'entrée peuvent être attribuées aux propriétés via des opérations de délégué.

void SetStringValue(string input, Action<string> setOutput)
{
    if (!string.IsNullOrEmpty(input))
    {
        setOutput(input);
    }
}

void Main()
{
    var person = new Person();
    SetStringValue("test", value => person.Name = value);
    Debug.Assert(person.Name == "test");
}
Copier après la connexion

3.Expression LINQ :

Cette méthode utilise une expression LINQ pour récupérer les champs de support de la propriété et attribuer la valeur d'entrée. (L'exemple de code de cette méthode contient des erreurs de syntaxe dans le texte original et ne peut pas être exécuté directement. Un exemple corrigé est fourni ci-dessous, mais il devra peut-être être ajusté en fonction de la situation réelle.)

void SetStringProperty<T, TProperty>(string input, T target, Expression<Func<T, TProperty>> propertyExpression)
{
    if (!string.IsNullOrEmpty(input))
    {
        var memberExpression = (MemberExpression)propertyExpression.Body;
        var propertyInfo = (PropertyInfo)memberExpression.Member;
        propertyInfo.SetValue(target, Convert.ChangeType(input, propertyInfo.PropertyType));
    }
}


void Main()
{
    var person = new Person();
    SetStringProperty("test", person, x => x.Name);
    Debug.Assert(person.Name == "test");
}
Copier après la connexion

4. Réflexion :

La réflexion peut être utilisée pour accéder aux champs sous-jacents d'une propriété et attribuer des valeurs d'entrée.

void SetPropertyValue(string input, object target, string propertyName)
{
    if (!string.IsNullOrEmpty(input))
    {
        var prop = target.GetType().GetProperty(propertyName);
        prop.SetValue(target, input);
    }
}

void Main()
{
    var person = new Person();
    SetPropertyValue("test", person, nameof(Person.Name));
    Debug.Assert(person.Name == "test");
}
Copier après la connexion

Il convient de noter que bien que la méthode d'utilisation des expressions de réflexion et LINQ puisse atteindre son objectif, elle est relativement inefficace et la lisibilité et la maintenabilité du code peuvent également être réduites. Il est recommandé de donner la priorité aux valeurs de retour ou aux méthodes déléguées sauf besoins particuliers. De plus, tous les exemples nécessitent la définition d'une classe Person, contenant un attribut Name nommé string.

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