gamon02
06-02-2007, 20:04
Oggi ho scoperto un'altro poco della mia ignoranza.
Vado a spiegare cosa mi opprime.
Io ho una classe banale:
public class Hello
{
private int x = 0;
public Hello()
{ }
public int Ics
{
get { return this.x; }
set { this.x = value; }
}
}
Perfetto, ora mettiamo, da un form Windows apro un'altro form dandogli in pasto una nuova istanza della mia classe:
Hello m_hello = new Hello();
m_hello.Ics = 5;
Formetto m_frm = new Formetto();
// Si assuma che .Dati sia una proprietà object del form
m_frm.Dati = m_hello;
m_frm.ShowDialog(this);
Perfetto, ora dall'altra parte, ovvero nel form Formeto (sono un genio dei nomi) farò un casting di Dati, modificherò la proprietà Ics e chiuderò il form, SENZA riassegnare a .Dati la classe (occhio).
// On Load
Hello m_frmhello = (Hello)this.Dati;
m_frmhello.Ics = 10;
this.Close();
Al ritorno nel nostro form di origine, l'istanza della classe Hello, m_hello, avrà il nuovo valore di Ics uguale a 10.
Questo comportamento fa presuppore un passaggio per ref o out, quando io invece non ho mai chiesto una cosa del genere!!
Invece passando a .Dati un oggetto di tipo non classe, ovvero int, string.. etc.. questo passaggio per referenza non avviene, ovvero il mio valore resta bello pacioso sul 5.
Ora, perchè accade questo? E c'è un sistema per evitarlo, oltre che fare un deep Clone della classe prima di passarglila a .Dati?
Grazie un miliardo o forse più
Vado a spiegare cosa mi opprime.
Io ho una classe banale:
public class Hello
{
private int x = 0;
public Hello()
{ }
public int Ics
{
get { return this.x; }
set { this.x = value; }
}
}
Perfetto, ora mettiamo, da un form Windows apro un'altro form dandogli in pasto una nuova istanza della mia classe:
Hello m_hello = new Hello();
m_hello.Ics = 5;
Formetto m_frm = new Formetto();
// Si assuma che .Dati sia una proprietà object del form
m_frm.Dati = m_hello;
m_frm.ShowDialog(this);
Perfetto, ora dall'altra parte, ovvero nel form Formeto (sono un genio dei nomi) farò un casting di Dati, modificherò la proprietà Ics e chiuderò il form, SENZA riassegnare a .Dati la classe (occhio).
// On Load
Hello m_frmhello = (Hello)this.Dati;
m_frmhello.Ics = 10;
this.Close();
Al ritorno nel nostro form di origine, l'istanza della classe Hello, m_hello, avrà il nuovo valore di Ics uguale a 10.
Questo comportamento fa presuppore un passaggio per ref o out, quando io invece non ho mai chiesto una cosa del genere!!
Invece passando a .Dati un oggetto di tipo non classe, ovvero int, string.. etc.. questo passaggio per referenza non avviene, ovvero il mio valore resta bello pacioso sul 5.
Ora, perchè accade questo? E c'è un sistema per evitarlo, oltre che fare un deep Clone della classe prima di passarglila a .Dati?
Grazie un miliardo o forse più