Si lo so è un argomento molto discusso nel web. Non chiedo di sapere cosa devo fare, ma
vorrei afferrare bene il concetto di variabili public in C#.
Ho il Form1 con un button, dichiaro una string, la inizializzo, premo il button e la
visualizzo. OK.
Così come è dichiarata, s è 'private'. E' visibile in tutto il Form1 ma non agli altricodice:public partial class Form1 : Form { string s; public Form1() { s = "un ciao dal Form1"; InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { MessageBox.Show(s); } }
forms. E questo è chiaro. Se anzichè 'private' la dichiaro 'public' dovrebbe essere
visibile a tutte le altre classi, e quindi agli altri forms che non sono altro che
"altre classi".
MA QUANDO MAI!!! E invece no. Devo creare una classe "speciale" in questo modo:codice:public partial class Form1 : Form { public string s; ........ }
Ora la variabile s sarà visibile da tutti i forms e accessibile con il suo nome scodice:public static class Class1 { public static string s = "ciao da TUTTI i forms!"; }
esteso. per esempio dal Form2 dentro un Button s sarà visualizzata così:
e allo stesso modo dentro il Form1, il Form3, il Form4 ecc. ecc. ecc.codice:public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { MessageBox.Show(Class1.s); } }
Mi e vi chiedo: ma perchè non basta dichiararla public una volta sola nel Form1? Ma
allora a che serve distinguere public e private? Devo ricorrere per forza ad una terza
classe e dichiarare diavolerie tipo 'public static'...per non parlare di certe cose ben peggiori che ho letto in giro, tipo creare una istanza di Form2 che faccia riferimento al Form1 nel costruttore...bleah!
Ecco la mia domanda precisa:
Dato che:
- una variabile public è accessibile a tutte le classi
- i forms sono classi
perchè s dichiarata public in Form1 non è visibile in Form2?
Grazie.

Ho fatto una semplice piccola domanda ben precisa:
Conosco la differenza tra classe e istanza, almeno questa l'ho capita. Non riesco a trasferirla a livello di forms: Form1 è una classe, e come oggetto è un'istanza della classe Form. Form2 è un'istanza diversa sempre della stessa classe Form. Class1 invece è tutta un'altra classe, che non deriva dalla classe Form (tutt'al più deriva da Object). Una variabile di istanza var1 di Form1 è vista da tutto il Form1 (cioè da ogni suo controllo, praticamente), ma non è vista da Form2. E viceversa, una variabile di istanza var2 è vista solo in Form2. Non serve a nulla dichiararle come private o public, non cambia nulla. Invece sia Form1 che Form2 "vedono" una variabile var3 dichiarata in Class1, se è dichiarata public static come la classe. Class1 non si istanzia, var3 appartiene alla classe Class1. var3 è visibile da Form1 e Form2 non perchè sia public, ma perchè è static. Tutta la classe Class1 è accessibile da ogni form, perchè è static. La mia difficoltà consiste in una "visione" tecnica offuscata: riesco a materializzare i due form come "oggetti" concreti, ma non riesco a percepire una Class1 che "aleggia come un fantasma" su tutti i forms e che "getta" le sue variabili ovunque. E' un pò come capire il funzionamento dell'atomo di Bohr ma non saperlo rappresentare a se stessi.
