+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Proprietà di classe readonly

  1. #1
    Salve,
    ho necessità di rendere una proprietà readonly


    public readonly double Lunghezza { get; set; }
    

    La funzionalità 'membri readonly' non è disponibile in C# 7.3. Usare la versione 8.0 o versioni successive del linguaggio.
    Il modificatore 'readonly' non è valido per questo elemento


    Ma quando vado a modificare la versione c# esce il messaggio "non è possibile modificare la versione c#".

    Ho provato ad impostare Framework più recente, ma è impossibile.


    Come è possibile risolvere il problema?

    Saluti
    Sebastiano Floridia

  2. #2
    Sgrubak non è in linea Scribacchino
    Semplicemente rimuovendo il set dalla dichiarazione:
    public double Lunghezza { get; }
    
    Quando erroneamente tenterai di assegnare in valore alla proprietà, l'Intellisense ti avviserà che non puoi perché readonly.

  3. #3
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Quote Originariamente inviato da SebastianoFloridia Visualizza il messaggio
    La funzionalità 'membri readonly' non è disponibile in C# 7.3. Usare la versione 8.0 o versioni successive del linguaggio.
    Il modificatore 'readonly' non è valido per questo elemento
    Il significato di readonly in C# sta a indicare che il valore alla proprietà o al campo può essere assegnato una sola volta, generalmente alla creazione dell'istanza, e non può più essere modificato in seguito.

    Nel tuo caso, sembra che tu voglia semplicemente una proprietà di sola lettura, che non vuol dire che tale proprietà non cambierà il proprio valore, bensì che il valore non possa essere impostato dall'esterno dell'oggetto: in quel caso, ti basta modificare la visibilità del costrutto set;:

    public double Lunghezza
    {
      get;
      private set;
    }
    
    Se rimuovi del tutto la parte del set;, la proprietà potrà essere impostata solo nel costruttore, mentre in questo modo puoi cambiarne il valore ovunque nel codice della classe, tranne che nel codice che fa uso del tuo oggetto.

    Ciao!
    ℹ️ Leggi di più su _alka_ ...

  4. #4
    Grazie!!!!
    Riassumendo quello che voglio ottenere è:

    Ipotizzate una linea con un punto iniziale ed uno finale (ini e fin sono le key del nodo].

    Impostando prima il punto iniziale e poi quello finale.

    vorrei ottenere la lunghezza sempre aggiornata.
    Da qui la scelta di renderlo solo lettura.
    vorrei che si aggiornasse ogni qualvolta si modificasse o l'inizio o la fine della linea.
    Vorrei avere sempre disponibile la lunghezza aggiornata.


     public class Linea
        {
            private string _ini="";
            public string ini
            {
                get { return _ini; }
                set
                {
                    _ini = value;
                   
                }
            }
    
            private string _fin = "";
            public string fin
            {
                get { return _fin; }
                set
                {
                    //double Xini;
                    //Double Yini;
                    ////Double Zini;
                    //double Xfin;
                    //double Yfin;
                    ////double Zfin;
    
                    //Xini = Globale.Nodi[_ini].X;
                    //Yini = Globale.Nodi[_ini].Y;
                    //Xfin = Globale.Nodi[_fin].X;
                    //Yfin = Globale.Nodi[_fin].Y;
                    _fin = value;
                    //_lunghezza = Math.Sqrt(Math.Pow((Xini - Xfin), 2) + Math.Pow((Yini - Yfin), 2));
                }
            }
    
            
            private double _lunghezza = 0;
            public double Lunghezza { get; }
    
    .......
    
    Ho remmato il codice dentro fin perchè va in errore.
    Spero di essere stato chiaro.

    Saluti
    Sebastiano Floridia

  5. Ciao,

    ogni volta che esegui il set di Ini o Fin calcoli la lunghezza e la memorizzi nella variabile privata _lunghezza;
    quindi ti basterà restituire nella property a sola lettura Lunghezza la variabile privata _lunghezza;

    ... più complicato a dirsi che a farsi
    ℹ️ Leggi di più su sspintux ...

  6. #6
    Ciao

    In verità ho fatto già così con il codice che vedi remmato.

    _lunghezza = Math.Sqrt(Math.Pow((Xini - Xfin), 2) + Math.Pow((Yini - Yfin), 2));


    ma ottengo sempre un valore = 0.

    Faccio qualche test più approfondito.
    Magari è una banalità che mi sfugge.

    Grazie Tante
    Sebastiano Floridia

  7. Quote Originariamente inviato da SebastianoFloridia Visualizza il messaggio
    Ciao

    In verità ho fatto già così
    ...
    Magari è una banalità che mi sfugge.
    ...
    ... probabile;
    la struttura della classe Linea seguente dovrebbe andare bene in linea di principo
    , a parte tipi di dato e calcolo lunghezza in 2D da fare secondo le tue strutture dati;

     public class Linea
     {
    
            public Linea()
            {
            }
    
            public Linea(double _ini, double _fin)
            {
                //imposto variabili private
                this._ini = _ini;
                this._fin = _fin;
                //calcolo  lunghezza attuale  in base alle var private
                setLunghezza();
            }
    
            private double _ini = 0;
            public double Ini
            {
                get { return _ini; }
                set
                {
                   //imposto variabile privata
                   this._ini = value;
                  //calcolo  lunghezza attuale  in base alle var private
                   setLunghezza();
                }
            }
    
            private double _fin = 0;
            public double Fin
            {
                get { return _fin; }
                set
                {
                    this._fin = value;
                  //calcolo  lunghezza attuale  in base alle var private
                    setLunghezza();
                }
            }
    
            private double _lunghezza = 0;
            public double Lunghezza
            {
               // restituisco la lunghezza  attuale in sola lettura 
              // già calcolata nella var privata _lunghezza ad ogni set di Ini o Fin
                get { return _lunghezza; }
            }
    
            private void setLunghezza()
            {
               // calcolo lunghazza in base alla var private
              //ToDo in 2 dimensioni secondo le tue strutture dati
                this._lunghezza = this._fin -  this._ini;  
            }
        }
    
    Ultima modifica di sspintux; 28-04-2020 01:58 
    ℹ️ Leggi di più su sspintux ...

  8. #8
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Quote Originariamente inviato da SebastianoFloridia Visualizza il messaggio
    Grazie!!!!
    Riassumendo quello che voglio ottenere è:
    Ipotizzate una linea con un punto iniziale ed uno finale (ini e fin sono le key del nodo].
    Impostando prima il punto iniziale e poi quello finale.
    vorrei ottenere la lunghezza sempre aggiornata.
    Da qui la scelta di renderlo solo lettura.
    In quel caso, è sufficiente inserire la proprietà Lunghezza implementando solo l'accesso get e inserendo al suo interno il calcolo, e il gioco è fatto.

    Prendendo il tuo esempio e la tua formula (anche se da rivedere):

    public double Lunghezza
    {
      get
      {
        return Math.Sqrt(Math.Pow((Xini - Xfin), 2) + Math.Pow((Yini - Yfin), 2));
      }
    }
    
    In questo modo, non sprechi spazio con il "backing field" in cui memorizzare il valore e non devi premunirti di andarlo a modificare ogni volta che le altre proprietà vengono modificate, ottenendolo sempre aggiornato.

    Ciao!
    ℹ️ Leggi di più su _alka_ ...

  9. Quote Originariamente inviato da _alka_ Visualizza il messaggio
    I
    ...
    In questo modo, non sprechi spazio con il "backing field" in cui memorizzare il valore e non devi premunirti di andarlo a modificare ogni volta che le altre proprietà vengono modificate, ottenendolo sempre aggiornato.
    ...
    .. ma in questo modo si rischia di rifare calcoli di lunghezza non necessari,
    e suppongo abbia molte aste (linee) e debba fare elaborazioni pesanti;

    Sceglierà Sebastiano come fare in base a cosa si adatta meglio al suo applicativo

    @Sebastiano
    per elevare al quadrato mi sa che ti conviene moltiplicare per se stesso piuttosto che usare la funzione di elevamento a potenza
    Ultima modifica di sspintux; 28-04-2020 11:33 
    ℹ️ Leggi di più su sspintux ...

  10. #10
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Quote Originariamente inviato da sspintux Visualizza il messaggio
    .. ma in questo modo si rischia di rifare calcoli di lunghezza non necessari
    In che senso? Il calcolo viene eseguito quando si accede alla proprietà. Le performance dipendono dagli accessi inutili che si fanno.

    Per contro, allora si potrebbe dire lo stesso del metodo di aggiornare la lunghezza a fronte del cambiamento dei dati correlati: ogni volta che se ne cambia uno (es. Ini o Fin) il valore della proprietà viene ricalcolato, e ipoteticamente potrebbe non essere necessario in quanto potrei ricadere in uno scenario tale per cui quel valore non viene mai letto.

    Se fosse una operazione più gravosa del calcolo che viene effettuato, sarei anche d'accordo, ma così come è stato proposto non ne vale la pena.

    Quote Originariamente inviato da sspintux Visualizza il messaggio
    e suppongo abbia molte aste (linee) e debba fare elaborazioni pesanti;
    Se così è, allora meglio predisporre un metodo di estrazione dei valori massivo, che li reperisca tutti in un botto, a seconda delle necessità.

    In ogni caso, la mia soluzione presenta problemi solo nel caso in cui si vada a leggere molto, molto spesso il valore della proprietà Lunghezza: se ciò avviene, il problema non è nella mia implementazione, ma nel codice che effettua più di una lettura del necessario.

    Quote Originariamente inviato da sspintux Visualizza il messaggio
    Sceglierà Sebastiano come fare in base a cosa si adatta meglio al suo applicativo
    Questo è palese, e sarebbe vero anche nel caso in cui scegliesse la soluzione più sbagliata che sia possibile trovare.

    Ciao!
    ℹ️ Leggi di più su _alka_ ...

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Risposte: 4
    Ultimo Post: 06-07-2019, 22:04
  2. redim di un vettore proprietà di una classe
    Da SebastianoFloridia nel forum C#
    Risposte: 2
    Ultimo Post: 06-07-2019, 10:36
  3. Risposte: 1
    Ultimo Post: 19-08-2015, 07:46
  4. Problema con proprieta' di classe
    Da GarGia1960 nel forum Visual Basic .Net
    Risposte: 4
    Ultimo Post: 04-10-2009, 17:56
  5. Proprietà "Underline" è "ReadOnly"
    Da TeGlider nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 01-04-2009, 19:33