J'ai un problème en utilisant une classe de structures.Les structures dynamiques échouent
est ici la définition de base:
using System;
struct Real
{
public double real;
public Real(double real)
{
this.real = real;
}
}
class Record
{
public Real r;
public Record(double r)
{
this.r = new Real(r);
}
public void Test(double origval, double newval)
{
if (this.r.real == newval)
Console.WriteLine("r = newval-test passed\n");
else if (this.r.real == origval)
Console.WriteLine("r = origval-test failed\n");
else
Console.WriteLine("r = neither-test failed\n");
}
}
Lorsque je crée une dynamique non-enregistrement, la définition des travaux réels (statique?).
Lorsque je crée un enregistrement dynamique, le réglage du réel ne fonctionne pas.
Lorsque je crée un enregistrement dynamique, je remplace les travaux réels.
Et voici le programme de test
class Program
{
static void Main(string[] args)
{
double origval = 8.0;
double newval = 5.0;
// THIS WORKS - create fixed type Record, print, change value, print
Record record1 = new Record(origval);
record1.r.real = newval; // change value ***
record1.Test(origval, newval);
// THIS DOESN'T WORK. change value is not making any change!
dynamic dynrecord2 = new Record(origval);
dynrecord2.r.real = newval; // change value
dynrecord2.Test(origval, newval);
// THIS WORKS - create dynamic type Record, print, change value, print
dynamic dynrecord3 = new Record(origval);
dynamic r = dynrecord3.r; // copy out value
r.real = newval; // change copy
dynrecord3.r = r; // copy in modified value
dynrecord3.Test(origval, newval);
}
}
Et voici la sortie: r = newval test passé r = origval-test a échoué r = newval-test a réussi
Quand je change la struct Real à la classe Real, les trois cas fonctionnent.
Alors, que se passe-t-il?
Merci,
Max
Règle de base; ** ne jamais faire une structure mutable **. Même si vous pensez que c'est sain d'esprit, ce n'est probablement pas le cas. –
Je devrais aussi ajouter; Les champs publics sont aussi un problème: votre code se comportera différemment si vous passez aux propriétés, ce qui est regrettable et à éviter. –
Ce code n'est évidemment pas destiné à la production. Les champs publics sont juste pour dépouiller la représentation la plus simple du problème. –