La meilleure façon d'expliquer mon problème est avec un extrait de code:type C# valeur avec un nombre dynamique de champs
enum Resource { ..., Size }
class ResourceVector
{
int[] values = new int[(int)Resource.Size];
public static ResourceVector operator + (ResourceVector a, ResourceVector b)
{...}
...
}
Nous utilisons partout ce type comme si elle était un type de valeur. C'est à dire. nous faisons l'hypothèse que:
ResourceVector b = a;
b += c;
n'affectera pas a
, parce que c'est la façon dont nous sommes habitués à parler de vecteurs (et c'est ainsi un vecteur avec un nombre fixe de champs ne se comporte, si elles sont appliquées comme struct). Cependant, comme cette hypothèse est fausse, elle a conduit à des bogues extrêmement subtils.
Je me demande s'il y a un moyen de faire ce comporter comme un type de valeur, autre que simplement l'élargissement des membres de Resource
chacun dans leurs propres membres dans une struct ResourceVector
(qui exige de toucher tous les membres de ResourceVector
si nous voulons ajouter un autre Resource
).
Oh, juste au cas où, nous travaillons avec C# 2.0. Donc pas de fonctionnalités fantaisies :-)
Merci.
Rendre immuable? http://weblogs.asp.net/bleroy/archive/2008/01/16/immutability-in-c.aspx –
On dirait que vous essayez de faire un drapeau enum? Si c'est le cas, faites-le au lieu de cela :) SI ce n'est pas le cas, marquez simplement struct, transmettez les valeurs dans un ctor, exposez-les comme une collection en lecture seule (ou renvoyez une copie du tableau), et off-hand disons que vous êtes bien (assurez-vous qu'il est immuable une fois que le ctor est fait :) –
donc si la structure dont vous avez besoin, pourquoi ne pas le transformer en struct et avoir vos méthodes opérateur retourner une nouvelle instance au lieu de modifier celui existant? –