Linguaggio C# - Eventi console

Buongiorno a tutti,
sto facendo qualche test di programmazione ad eventi su console e non capisco perché visualizzo il seguente errore:

Ho messo il codice su qui: https://github.com/portanza/ConsoleApp_Test_Eventi

Come posso risolvere? Perché si genera l’eccezione?

Il programmino chiede il saldo iniziale di un conto corrente,
image

poi chiede di prelevare una cifra
image

e se questa è superiore alla disponibilità genera un evento che invia un messaggio a video.

Buongiorno Luca

Scusa una domanda, forse non c’entra con l’errore che riscontri …
Certo c’entra con la mia ignoranza su C#. :blush:
E’ una curiosita’ sulla sintassi.

Suppongo che SaldoProprieta’ sia un campo privato (il link a GitHub non funziona)

Se il campo e la property (set) hanno lo stesso nome e sono entrambi privati, come fa C# a capire a cosa ti riferisci quando assegni un valore a SaldoProprieta’ ? :slight_smile:

Forse C# capisce che il risultato e’ lo stesso e non si preoccupa ?

1 Mi Piace

ConsoleApp_Test_Eventi-master.zip (7,9 KB)

E’ una proprietà public. Devo poter cambiare il valore del conto da console una volta avviato il programma (sono solo dei test).

ps https://github.com/portanza/ConsoleApp_Test_Eventi.git

Quindi la proprieta’ non si appoggia ad un campo ?
Allora non capisco qui a cosa si riferisce il “SaldoProprieta’” … :confused:

get
{
  return SaldoProrpieta';
}

Ma non e’ importante, sono io che non sono per niente aggiornato col C# …

Nella tua pagina GitHub ci entro.
Pero’ non trovo ConsoleApp_Test_Eventi

Ma di nuovo, non e’ importante.

Grazie per la risposta.
Ciao !

sopra ho messo il file zip.

Guarda che è piu facile che scrivo io fesserie Emilio.
Mi spighi cosa intendi per proprietà che si appoggia ad un campo?

sto cercando di capire come renderlo pubblico.Al limite inviami una richiesta, se lo consente, e ti abilito.

Non riesco a vedere il codice … github mi da una pagina 404 al tuo link.

Però… vedi qua:

Non è che il problema è che stai usando un metodo “SaldoProprietà” che ha lo stesso identico nome della variabile “SaldoProprietà”?
Su w3schools usano “Name” e “name” … diverse.


Letto dopo :sweat_smile:

1 Mi Piace

La “Encapsulation” serve proprio per non dare accesso diretto a delle variabili, tipo:

class Person {
  private int NS;
  private int delta=1;

  public int NumeroSegreto {
    get { return NS+delta; }
    set { NS= value-delta; }
  }
}

In questo ^ esempio stupido, il numerosegreto è salvato con un valore diverso da quello che l’utente conosce.
Dentro i metodi “get” e “set” puoi fare quello che vuoi, anche lanciare altri metodi che vuoi che vengano eseguiti qualora qualcuno stia cercando di cambiare o leggere quel valore.

Una proprieta’ che serva a leggere e scrivere il valore di un campo privato.

Provo a scrivere un esempio, copiando quanto fatto da Riccardo … :blush: :wink:

class Test {
  private int totale;

  public int Totale {  
    get { return totale; }
    set { totale = value; }
  }
}

qui il campo e’ totale mentre la proprieta’ e’ Totale.
Il mio dubbio era che dando lo stesso nome a campo e proprieta’, C# si confondesse …

1 Mi Piace
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp_Test_Eventi
{

    // Definizione di un publisher (editore)
    public class ContoBancario
    {

        // Dichiarazione di un delegato per l'evento
        public delegate void SaldoInsufficienteHandler(object sender, EventArgs e);
        public delegate void PrelevaHandler(object sender, EventArgs e, decimal saldoProprietà, decimal importoProprietà);
        

        // Dichiarazione dell'evento utilizzando il delegato
        public event SaldoInsufficienteHandler? SaldoInsufficiente;
        public event PrelevaHandler? Preleva;

        public decimal importoProprietà
        {
            get
            {
                return importoProprietà;
            }

            set => importoProprietà = value;
        }

        private decimal saldoProprietà;
        public decimal SaldoProprietà
        {
            get
            {
                return saldoProprietà;
            }
            set => saldoProprietà = value;
        }


        /// <summary>
        /// Setta il conto iniziale
        /// </summary>
        /// <param name="saldoIniziale"></param>
        public ContoBancario(decimal saldoIniziale)
        {
            saldoProprietà = saldoIniziale;
        }

            

Mi sembra che adesso la stessa cosa capiti con importoProprieta’

Quando scrivi

            get
            {
                return importoProprietà;
            }

importoProprieta’ cosa indica ?
( Non vedo un campo, o se vogliamo variabile, con quel nome )

Comunque, cosi’ funziona o da’ errore ? :slight_smile:

1 Mi Piace

esatto…

Su grasshopper questa parte va in loop e fa crashare Rhino:

public decimal importoProprietà {
   get { return importoProprietà; }
   set { importoProprietà = value; }
}

Il metodo “importoProprietà” cerca di richiamare un certo “importoProprietà” e dato che non esiste una variabile con quel nome, richiama se stesso, un metodo … e va in loop crash.

Questo invece:

public decimal lol; // manca questa riga!
public decimal importoProprietà {
   get { return lol; }
   set { lol = value; }
}

funziona.

1 Mi Piace

Si si questo risolto grazie mille, avevate ragione, vedi Emilio, la fesseria è più facile che la scriva io.
Allora vò avanti col secondo problema.

1 Mi Piace

Errore numero 2:

PS non riuscite a vedere il codice su Git? Strano, eventualmente se mi passate una vostra mail vi inserisco.

PS2

Non vedo git, e non ho mai lavorato con gli eventi… stasera mi informo…

è un problema legato alla firma.

Mi sembra che qui parli di un utilizzo di qualcosa di static attraverso una istanza.

immagine

Qui il delegate e’ dichiarato public

      public delegate void PrelevaHandler(object sender, EventArgs e, decimal saldoProprietà, decimal importoProprietà);

mentre questo e’ dichiarato public static

… Poi non so se sia questo il problema … :confused:

Per l’altro errore non saprei, purtroppo non conosco gli eventi … :blush:

1 Mi Piace

si era lo static, un refuso. :wink:

1 Mi Piace

Comunque non sempre il debug di Visual Studio si capisce. Mi pare ostico a volte.

Personalmente preferisco usare l’inglese per queste cose, i termini inglesi solitamente sono sempre quelli.
Con le traduzioni non sai mai cosa viene fuori … :smile:
Anche se, da quello che hai postato, questi messaggi mi sembrano piuttosto ben tradotti. :slight_smile:

Poi, certo, ad esempio per gli eventi, non conoscendoli non riesco a risalire all’origine dell’errore. :blush:

Signori, felice di dirvi che ho risolto e imparato un botto di cosette nuove sugli eventi:

image

Il programmino funzione bene, passa i dati attraverso gli eventi e li mostra correttamente
:grinning: :grinning: :grinning:

ps su git c’è se qualcuno volesse studiarlo un po’ per capire gli eventi. E’ tutto commentato.

2 Mi Piace