Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 48
  1. #1
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308

    [C#] Windows Forms - variabili visibile in più forms

    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.

    codice:
          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);
    
              }
    
    
          }
    Così come è dichiarata, s è 'private'. E' visibile in tutto il Form1 ma non agli altri

    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".

    codice:
          public partial class Form1 : Form
          {    
              public string s; 
               
              ........  
    
    
          }
    MA QUANDO MAI!!! E invece no. Devo creare una classe "speciale" in questo modo:

    codice:
        public static class Class1
        {
            public static string s = "ciao da TUTTI i forms!";
    
    
        }
    Ora la variabile s sarà visibile da tutti i forms e accessibile con il suo nome s

    esteso. per esempio dal Form2 dentro un Button s sarà visualizzata così:

    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);
     
            }  
             
    
        }
    e allo stesso modo dentro il Form1, il Form3, il Form4 ecc. ecc. ecc.
    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.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Originariamente inviato da escocat
    vorrei afferrare bene il concetto di variabili public in C#.
    Semplicemente, non esistono: si parla di campi e proprietà, eventualmente statici.

    Originariamente inviato da escocat
    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!
    Il tuo problema è solo uno: devi capire la programmazione orientata agli oggetti (OOP).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Suvvia, Alka, fai il bravo. Ho fatto una semplice piccola domanda ben precisa:
    codice:
    Dato che:
    - una variabile public è accessibile a tutte le classi
    - i forms sono classi
    perchè s dichiarata public in Form1 non è visibile in Form2?
    Ma che se qualcuno ti chiede perchè Roma si chiama Roma tu gli dici di studiare tutti e tre volumi di storia del Silva?

    Sto studiando l'Object Oriented, che credi che non sto studiando? Da questo post non si capisce che sto studiando?
    Ah no?

    Mi manca solo questo piccolo passaggio (per ora)

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Originariamente inviato da escocat
    Ho fatto una semplice piccola domanda ben precisa
    E io ti ho dato una risposta ben precisa.

    codice:
    Dato che:
    - una variabile public è accessibile a tutte le classi
    - i forms sono classi
    perchè s dichiarata public in Form1 non è visibile in Form2?
    La tua domanda è l'equivalente di chiedere "come fa una macchina a muoversi?".

    Se lo intendi in senso generale, è presto detto, ma tu poni una domanda che per avere una risposta precisa richiede che tu capisca il paradigma di programmazione che vi sta dietro, altrimenti non sarai in grado di capire la risposta, e ovviamente non ho voglia di riportare qui tutto ciò che è già fruibile altrove.

    Dire "non è visibile" non ha senso: se io ho una variabile pubblica in un Form e creo un oggetto, la variabile la vedo, sicuro. Forse non la vedi come vorresti vederla, ma questo perché tu stai presupponendo che il tutto funzioni in modo che non è quello che ti aspetti.

    E come funziona realmente? Vedi il link che ti ho passato, e capirai.


    codice:
    Ma che se qualcuno ti chiede perchè Roma si chiama Roma tu gli dici di studiare tutti e tre volumi di storia del Silva?  :biifu:
    Se la comprensione del perché Roma si chiama Roma richiede di studiare volumi di storia, lo suggerirei anche in quel caso, ma non è così, mentre lo è per la tua domanda perché questo esempio non è calzante.

    Sto studiando l'Object Oriented, che credi che non sto studiando? Da questo post non si capisce che sto studiando?
    Ah no?
    Mi manca solo questo piccolo passaggio (per ora)
    Non mi interessa cosa stai facendo: se poni una domanda del genere, significa che non hai chiaro ciò che nel link che ti ho passato è spiegato, e che usa termini diversi da quelli che hai indicato tu, da cui si evince che stai utilizzando il dizionario della modalità con cui tu pensi che le cose funzionino, e non quelle che hai letto.

    Leggi bene, fai ricerche sui concetti di classe e oggetti e sui livelli di visibilità dei suoi membri, e vedrai che le cose ti appariranno chiare, o almeno avrai un dubbio specifico su un concetto "concreto".
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Mi trovo d'accordo con alka ... le risposte a questo tipo di domande sta nell'effettiva comprensione della OOP.

    In pratica, se l'avessi avuta chiara, non avresti fatto questa domanda ....
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Quindi non è possibile rispondere alla mia domanda in poche righe.
    Evidentemente sono "male abituato" col VB, e uso male i significati di 'public' e 'private'.
    Ma ora che ci penso .... anche in VB5 una variabile dichiarata public in un form non era vista in un altro form. Dovevo dichiararla public in un modulo.bas! Proprio come ho fatto adesso in C# (la classe Class1 corrisponderebbe al vecchio modulo.bas). L'unica complicazione è lo 'static' in più....
    OK scusate ho capito quello che volevate dirmi.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Se posso darti un altro consiglio ... lascia stare VB5/6, non fare confronti con VB.NET ... era tutta un'altra storia, non solo dal punto di vista tecnologico ma proprio "teorico".

    VB5/6 non era OOP ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    La differenza sta nei concetti di oggetto (o istanza di una classe) e classe:
    Una classe è un modello da seguire che definisce le proprietà di un oggetto.
    Un oggetto invece è l'istanza di una classe.

    Puoi fare un paragone del genere:
    -il progetto di una casa -> classe
    -tre case costruite seguendo quel progetto -> oggetti

    Quel static sta ad indicare che una determinata proprietà appartiene alla classe e non all'oggetto.


    Questo è un riassunto veloce veloce, ora ti consiglio di approfondire
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Mi state trattando come un vecchio asino 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.

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Form1 e Form2 ereditano da Form, sono classi figlie, non istanze...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.