J'écris un itérateur qui doit faire passer un entier mutable. Ceci me met "Erreur 476 Iterators ne peut pas avoir de paramètres ref ou out".Enveloppe Mutable des types de valeur à passer dans les itérateurs
Ce dont j'ai besoin, c'est que cette valeur entière soit modifiée dans l'itérateur et utilisable par l'appelant de l'itérateur. En d'autres termes, quels que soient les appels Foo()
ci-dessus veut savoir la valeur de fin de valueThatMeansSomething
et Foo()
peut l'utiliser lui-même. Vraiment, je veux un entier qui soit un type de référence et non un type de valeur. Tout ce que je peux penser est d'écrire une classe qui encapsule mon entier et me permet de le modifier.
public class ValueWrapper<T>
where T : struct
{
public ValueWrapper(T item)
{
this.Item = item;
}
public T Item { get; set; }
}
Alors:
ValueWrapper<int> w = new ValueWrapper<int>(0);
foreach(T item in Foo(w))
{
// Do stuff
}
if (w.Item < 0) { /* Do stuff */ }
Y at-il une classe ou d'un mécanisme pour gérer ce déjà dans le BCL? Des défauts avec ValueWrapper<T>
proposé ci-dessus?
(Mon utilisation réelle est plus complexe que l'exemple ci-dessus la manipulation si la variable dans ma boucle foreach
qui appelle Foo()
est pas une option. Période.)
La création d'un champ volatile n'est pas suffisante pour assurer la sécurité des threads car les écritures sur des types de valeur arbitraires ne sont pas garanties par la spécification C#. Volatile ne garantit pas l'atomicité, il élimine simplement certains problèmes d'ordre induits par l'optimisation du compilateur. –
Si vous vous souciez de la sécurité des filetages, utilisez des verrous. –
@Eric: Oui, bon point. J'ai écrit à l'origine qu'il garantit l'atomicité, mais je l'ai rapidement supprimé car j'ai réalisé que ce n'était pas nécessairement le cas. – Noldorin