Impossible de Modifier les Membres de la structure
Je ne suis pas nouvelle à la programmation, mais il semble y avoir un trou dans ma compréhension de C# des structures.
Quelqu'un peut-il expliquer pourquoi le code suivant affiche "Dist1: 0, Dist2: 0"?
struct Distance
{
public void SetFeet(int feet) { Value = feet; }
public void SetMiles(float miles) { Value = (int)(miles * 5280f); }
public int GetFeet() { return Value; }
public float GetMiles() { return Value / 5280f; }
private int Value;
}
class Distances
{
public Distance Dist1 { get; set; }
public Distance Dist2 { get; set; }
}
class Program
{
static void Main(string[] args)
{
Distances distances = new Distances();
distances.Dist1.SetFeet(1000);
distances.Dist2.SetFeet(2000);
Console.WriteLine("Dist1: {0}, Dist2: {1}",
distances.Dist1.GetMiles(),
distances.Dist2.GetMiles());
Console.ReadLine();
}
}
C'est exactement pourquoi il n'est pas une bonne idée d'avoir mutable des structures.
Bien, mais alors comment pourriez-vous mettre en œuvre le code pour affecter une valeur à cette structure lorsqu'il y a plusieurs façons d'interpréter les arguments? (Dans mon cas, je suppose que je pourrais attribuer une
Rendre immuable. Que dans, ne pas faire-il possible de changer les valeurs stockées dans votre structure. Regardez les interfaces publiques de valeur existante types dans le cadre et la façon dont ils gèrent "l'évolution des valeurs." Voir:
Bien, mais alors comment pourriez-vous mettre en œuvre le code pour affecter une valeur à cette structure lorsqu'il y a plusieurs façons d'interpréter les arguments? (Dans mon cas, je suppose que je pourrais attribuer une
int
ou float
et les ont interprétées comme des pieds et des miles, respectivement, mais mon vrai code a plusieurs façons d'interpréter la valeur sous-jacente.)Rendre immuable. Que dans, ne pas faire-il possible de changer les valeurs stockées dans votre structure. Regardez les interfaces publiques de valeur existante types dans le cadre et la façon dont ils gèrent "l'évolution des valeurs." Voir:
DateTime
, String
, KeyValuePair<TKey, TValue>
. Je pourrais ajouter une réponse si Yahia n'est pas satisfaisante.OriginalL'auteur Jonathan Wood | 2011-08-27
Vous devez vous connecter pour publier un commentaire.
struct sont des types de valeur - de sorte que lorsque vous accédez à
distances.Dist1.SetFeet
en gros, vous accédez à une copie... voir par exemple sur le site MSDN http://msdn.microsoft.com/en-us/library/aa288471%28v=vs.71%29.aspx[EDIT après le commentaire]
Otoh, que si vous ne
distances.Dist1 = new Distance ().SetFeet (1000);
ET modifier le retour deSetFeet
devoid
àDistance
il devrait fonctionner. Sinon faireDistance
une classe.Pour une référence sur la façon de construire les structures de façon qu'ils fonctionnent comme prévu voir le
DateTime
structure dans le cadre de http://msdn.microsoft.com/en-us/library/system.datetime.aspx[/EDIT après le commentaire]
distances.Dist1.SetFeet()
est une copie. Où est la copie? Pouvez-vous développer?Si
SetFeet()
est unvoid
fonction...je viens d'ajouter un lien vers MSDN avec des exemples similaires à la vôtre, l'accès à distances.Dist1 vous donne une valeur (pas une référence)... c'est une copie du champ Dist1 - vous appelez SetFeet sur cette copie... changer la structure d'une classe et de voir immédiatement que cela fonctionne (car alors vous obtenez une référence)
vous avez raison, mon erreur... donc ça ne marche même pas...
Ok, j'ai maintenant. Merci. Semble un peu maladroite, je ne peux pas utiliser votre code, car
SetFeet()
ne retourne pas une valeur qui peut être attribuée à Dist1.OriginalL'auteur Yahia
Getters et setters-comment propriétés sont accessibles -- fonctionnent toujours comme des méthodes à cet égard. C'est,
est "équivalent" à
La "copie" de la structure (de la valeur) est faite quand il est retourné à partir de la lecture (ou passée au setter). Si
Dist1
ont été un variable membre ce ne serait pas le cas et travailler "comme prévu".Heureux de codage.
OriginalL'auteur