J'essaie de faire ce qui suit:
GetString(
inputString,
ref Client.WorkPhone)
private void GetString(string inValue, ref string outValue)
{
if (!string.IsNullOrEmpty(inValue))
{
outValue = inValue;
}
}
Cela me donne une erreur de compilation. Je pense que c'est assez clair ce que j'essaie de réaliser. Fondamentalement, je veux GetString
copier le contenu d'une chaîne d'entrée dans la WorkPhone
propriété de Client
.
Est-il possible de transmettre une propriété par référence?
c#
properties
pass-by-reference
yogibear
la source
la source
Réponses:
Les propriétés ne peuvent pas être transmises par référence. Voici quelques façons de contourner cette limitation.
1. Valeur de retour
2. Délégué
3. Expression LINQ
4. Réflexion
la source
code
chaîne statique publique GetValueOrDefault (cette chaîne s, chaîne isNullString) {if (s == null) {s = isNullString; } Retour; } void Main () {person.MobilePhone.GetValueOrDefault (person.WorkPhone); }getOutput
n'est pas nécessaire.GetString
qui est censée définir une propriété est clairement mal nommée.sans dupliquer la propriété
la source
GetString
deNullSafeSet
, parce que le premier n'a pas de sens ici.J'ai écrit un wrapper en utilisant la variante ExpressionTree et c # 7 (si quelqu'un est intéressé):
Et utilisez-le comme:
la source
Si vous souhaitez obtenir et définir la propriété à la fois, vous pouvez l'utiliser en C # 7:
la source
Une autre astuce non encore mentionnée est que la classe qui implémente une propriété (par exemple
Foo
de typeBar
) définisse également un déléguédelegate void ActByRef<T1,T2>(ref T1 p1, ref T2 p2);
et implémente une méthodeActOnFoo<TX1>(ref Bar it, ActByRef<Bar,TX1> proc, ref TX1 extraParam1)
(et éventuellement des versions pour deux et trois "paramètres supplémentaires") qui passera sa représentation interne deFoo
à la procédure fournie commeref
paramètre. Cela présente quelques grands avantages par rapport aux autres méthodes de travail avec la propriété:Faire passer les choses
ref
est un excellent modèle; dommage qu'il ne soit plus utilisé.la source
Juste une petite extension de la solution Linq Expression de Nathan . Utilisez plusieurs paramètres génériques pour que la propriété ne se limite pas à la chaîne.
la source
Ceci est couvert dans la section 7.4.1 de la spécification du langage C #. Seule une référence de variable peut être passée en tant que paramètre ref ou out dans une liste d'arguments. Une propriété ne peut pas être considérée comme une référence de variable et ne peut donc pas être utilisée.
la source
Ce n'est pas possible. Tu pourrais dire
où se
WorkPhone
trouve unestring
propriété inscriptible et la définition deGetString
est modifiée enCela aura la même sémantique que vous semblez essayer.
Ce n'est pas possible car une propriété est en réalité une paire de méthodes déguisées. Chaque propriété met à disposition des getters et setters accessibles via une syntaxe de type champ. Lorsque vous essayez d'appeler
GetString
comme vous l'avez proposé, ce que vous transmettez est une valeur et non une variable. La valeur que vous transmettez est celle renvoyée par le getterget_WorkPhone
.la source
Ce que vous pourriez essayer de faire est de créer un objet pour contenir la valeur de la propriété. De cette façon, vous pourriez passer l'objet et avoir toujours accès à la propriété à l'intérieur.
la source
Les propriétés ne peuvent pas être transmises par référence? Faites-en ensuite un champ et utilisez la propriété pour le référencer publiquement:
la source
Vous ne pouvez pas
ref
une propriété, mais si vos fonctions ont besoin des deuxget
et d'unset
accès, vous pouvez passer autour d'une instance d'une classe avec une propriété définie:Exemple:
la source
La réponse acceptée est bonne si cette fonction est dans votre code et que vous pouvez la modifier. Mais parfois, vous devez utiliser un objet et une fonction d'une bibliothèque externe et vous ne pouvez pas modifier la définition de la propriété et de la fonction. Ensuite, vous pouvez simplement utiliser une variable temporaire.
la source
Pour voter sur cette question, voici une suggestion active de la façon dont cela pourrait être ajouté à la langue. Je ne dis pas que c'est la meilleure façon de le faire (du tout), n'hésitez pas à présenter votre propre suggestion. Mais permettre aux propriétés d'être passées par ref comme Visual Basic peut déjà le faire aiderait énormément à simplifier du code, et assez souvent!
https://github.com/dotnet/csharplang/issues/1235
la source