14Fermer16
GoldenCrystalLe 15/05/2009 à 20:48
Zephyr (./13) :
Bon, faute de mieux je suis parti sur la solution du ./12
Oué enfin pour le coup ton SetValue n'est pas sensé accepter un string (ça devrait générer une exception de cast) alors que le ConvertFrom si, donc ça serait plus propre de l'utiliser smile
J'aurais besoin de créer un objet, disons "Modifier", qui prenne en paramètre une référence vers une variable (ou un attribut) et qui soit capable par la suite de modifier cette variable. Le détail c'est que par "modifier" je ne parle pas d'appeler ses méthodes et autres, mais bien de remplacer la valeur de la variable. Le problème c'est que pour ça il me faut conserver une référence vers la variable en question, mais que le mot-clé "ref" du C# se limite aux paramètres des fonctions.

Ce qui est parfaitement normal sachant que
[ol][li]Une référence est un pointeur[/li]
[li]Tu ne sais pas sur quoi pointe un pointeur: Est-ce que c'est un champ d'une classe ou bien une variable locale d'une fonction[/li][/ol]
Certes il y a bien des pointeurs, mais c'est "unsafe" et j'ai cru comprendre qu'il fallait prendre pas mal de précautions pour éviter que la CLR ne modifie les adresses lors d'un passage du GC.
Ce truc s'appelle le pinning (je laisse aux lecteurs le loisir de traduire en fr) et en C# c'est pas bien compliqué, ça se fait avec un petit coup de fixed( ... ) {}, et en dehors de ça, le code usafe fonctionne très bien avec des paramètres de sécurité normaux, il faut juste éviter de l'utiliser quand ce n'est pas nécessaire.
En C++ ça serait très facile : il suffirait que "myRef" soit de type "T&" et qu'il soit initialisé dans le constructeur de "Modifier". Mais en C# la seule solution que j'ai trouvée consiste à passer à "Modifier" non pas une référence vers la variable mais deux delegates (un setter et un getter). Ça marche très bien mais ça m'oblige à déclarer deux méthodes pour chaque variable que je veux "Modifier"-er (voilà ce que ça donne) : très lourd.
Y-a-t'il moyen de faire autrement ?
Fais toi un listing des façons différentes accéder à une valeur dans un type en C#... Tu t'apercevras que la liste n'est pas si longue que ça.
Après la méthode la meilleure dépend de ce que tu veux faire précisément, mais celle que tu as trouvé est la moins couteuse au niveau mémoire je pense.
Après tu peux envisager d'utiliser des propriétés ou des méthodes Dynamiques pour éviter de devoir créer explicitement ces méthodes get/set... Mais je crois que ça s'arrête la...
Pour le reste si tu veux vraiment une référence tu devras utiliser un type référence (genre Boxed<T>) et je pense que c'est tout tongue