Changer la valeur dans une méthode d’extension (void)

J’ai donc cette méthode d’extension factice qui modifie une valeur en une autre valeur:

public static void ChangeValue(this int value, int valueToChange) { value = valueToChange; } 

Quand j’essaye de l’utiliser:

 int asd = 8; asd.ChangeValue(10); Debug.Log(asd); 

Il retourne 8 au lieu de 10. Bien que la valeur ait changé dans la méthode ChangeValue, elle n’a pas changé la valeur de “asd”. Que dois-je append à la méthode pour la mettre à jour “asd”?

int est une struct donc c’est un value-type . cela signifie qu’ils sont passés par valeur et non par référence. Les classes sont reference-types et agissent différemment, elles sont passées par référence.

Votre option est de créer une méthode statique comme ceci:

 public static void ChangeValue(ref int value, int valueToChange) { value = valueToChange; } 

et l’utiliser:

 int a = 10; ChangeValue(ref a, 15); 

Vous ne pouvez pas faire cela sans utiliser une valeur de return ou un paramètre ref . Ce dernier ne fonctionne pas parallèlement à this (méthodes d’extension), votre meilleur choix est donc une valeur de return (plutôt que void ).

Selon cette réponse: https://stackoverflow.com/a/1259307/1945651 , il n’y a pas de moyen de le faire en C #. Les types primitifs tels que int sont immuables et ne peuvent pas être modifiés sans modificateur out ou ref , mais la syntaxe ne permet pas out ou ref ici.

Je pense que votre meilleur cas est que la méthode d’extension renvoie la valeur modifiée au lieu d’essayer de modifier l’original.

Apparemment, cela est possible dans VB.NET et si vous en avez absolument besoin, vous pouvez définir votre méthode d’extension dans un assemblage VB.NET, mais ce n’est probablement pas une très bonne pratique en premier lieu.

Je sais que c’est trop tard, mais juste pour l’enregistrement, j’ai récemment vraiment voulu faire ça, je veux dire …

 someVariable.ChangeValue(10); 

… apparemment plus soignée que la suivante (qui convient parfaitement)

 ChangeValue(ref someVariable, 10); 

Et j’ai réussi à réaliser quelque chose de similaire en faisant:

 public class MyClass { public int ID { get; set; } public int Name { get; set; } } public static void UpdateStuff(this MyClass target, int id, ssortingng name) { target.ID = id; target.Name = name; } static void Main(ssortingng[] args) { var someObj = new MyClass(); someObj.UpdateStuff(301, "RandomUser002"); } 

Notez que si l’argument transmis est de type référence, il doit d’abord être instancié (mais pas à l’intérieur de la méthode d’extension). Sinon, la solution de Leri devrait fonctionner.

Parce que int est le type valeur, il est donc copié par valeur lorsque vous le passez à l’intérieur d’une fonction.

Pour voir les changements en dehors de la fonction, réécrivez-le comme suit:

 public static int ChangeValue(this int value, int valueToChange) { //DO SOMETHING ; return _value_; //RETURN COMPUTED VALUE } 

Il serait possible de faire en utilisant ref keyowrd, mais cela ne peut pas être appliqué avec un paramètre avec this , donc dans votre cas, retournez simplement la valeur résultante.