Lezioni informali di programmazione C# per principianti.
Livello: principianti
Prerequisiti: nessuno (salvo la voglia di sapere)
Se volete una descrizione storica di C# qui trovate la pagina dedicata di Wikipedia dove sono spiegati i quando, i dove, i come ed i perché della sua nascita, in questo articolo invece ci occuperemo di dare le prime informalissime nozioni su che cosa ci si pùo fare e come funziona.
C# è un linguaggio di programmazione, già il fatto che sia un Linguaggio ci può dare alcuni indizi al suo riguardo. Un linguaggio di programmazione è simile ad un linguaggio umano, infatti ha un vocabolario, una punteggiatura, una sintassi ed una grammatica. E’ un linguaggio scritto e come tale ci permette di scrivere nello specifico non dei testi, anche se quello che scriviamo in effetti sono dei testi. Ma del codice che può essere interpretato da un compilatore e tradotto in linguaggio macchina comprensibile ad un computer.
Se vi chiedete perché non scriviamo i programmi direttamente in linguaggio macchina e perché sono stati creati i linguaggi di alto livello come C#, semplicemente perché a basso livello, quello che il computer elabora sono numeri, quindi se non usassimo i linguaggi ad alto livello, prima di tutto dovremmo imparare dei codici numerici non esattamente facili, e secondariamente dovremo scrivere manualmente milioni di numeri per creare i nostri programmi. Pertanto i linguaggi di alto livello sono una stenografia che permette all’essere umano di scrivere il software in un modo congeniale e al computer di capire che cosa l’umano vuole che faccia.
Considerato che se state leggendo questo articolo siete alle prime armi, fate attenzione, nonostante esistano le prime rudimentali IA, in grado di parlare e rispondere a dei comandi, come ad esempio SIRI e CORTANA, sfortunatamente almeno noi poveri utenti medi, siamo ancora ad anni luce dai computer che capiscono il linguaggio parlato come in Star Trek e ben più lontani dalle intelligenze artificiali come il JARVIS di Iron Man. Fortunatamente questo significa che siamo anche molto lontani da Skynet :). Magari sarete voi in futuro a scrivere le prossime intelligenze artificiali, e queste lezioni in qualche modo vi daranno una mano a iniziare ad avvicinarvi al mondo affascinante e creativo della scrittura di software.
Disquisizioni a parte, torniamo a C#. C# è un linguaggio di programmazione che usa il paradigma di programmazione OOP ovvero Object Oriented Programming, quindi Programmazione Orientata agli Oggetti.
E adesso ci hai spiegato tutto!!! direte voi.
Va bene, cerco di essere chiara: C# permette di costruire programmi utilizzando quello che siamo abituati a fare nel mondo reale, ovvero utilizzare oggetti per compiere azioni, esattamente come facciamo per qualsiasi nostra attività.
Tutti noi siamo capaci di descrivere un oggetto, di utilizzare un oggetto, di costruire un oggetto, di distruggere un oggetto, pertanto il paradigma OOP dovrebbe essere abbastanza facile da comprendere a qualsiasi essere umano. Il Condizionale è d’obbligo, perché non è sempre così, ma usualmente, le difficoltà non sono un problema di chi si sta avvicinando la prima volta alla programmazione, ma invece da parte di chi ha utilizzato diversi modi di lavorare in precedenza. Quali? I linguaggi a basso livello, i linguaggi strutturati non ad oggetti, quali C, Basic, Cobol, i linguaggi Object friendly, quali Visual Basic e VBA, i linguaggi completamente destrutturati, per quanto contengano oggetti, come Javascript. Mentre chi proviene da C++ o da Objective C o da Java, non avrà alcun tipo di problema ad adattarsi perché il paradigma ad oggetti è simile e C# è per gran parte equivalente, anche se in alcuni casi, come ad esempio C++ e Objective C, C# è notevolmente più semplice.
Cerchiamo di comprendere cosa vuol dire oggetto nel mondo ‘etereo’ della programmazione, cercate di ricordarvi il fatto che la programmazione non assomiglia neppure da lontano a quello che si vede nei telefilm, men che meno nei film, neppure le biografie dei pirati di Silicon Valley.
Cos’è un programma all’interno di un Computer (indipendentemente che sia un PC un Mac, o una device Linux, Android, Arduino o chi più ne ha…) un programma è un file contenente la rappresentazione numerica di una certa quantità di istruzioni che pilotano l’hardware della macchina per interagire con l’utente, o nel caso di device quali i sistemi a controllo numerico, i sistemi di controllo domotici, i droni e simili, pilotano l’hardware ad interagire con l’ambiente.
Sapete cosa succede quando fate doppio click sull’icona del programma, o quando su una device viene eseguito il vostro programma?
Per prima cosa il sistema operativo (che è un altro programma, o meglio una serie di programmi) apre il file eseguibile e lo carica in memoria, a questo punto, verificato che si tratta di un programma, va a cercare un Entry Point ovvero un nome, che per convenzione si chiama “Main” dove iniziano le istruzioni che deve eseguire, da qui, le istruzioni del programma dicono al computer che cosa vogliono che faccia in termini di allocazione di risorse, creazione di oggetti grafici o di altro genere per svolgere il compito per cui è stato disegnato. La prima cosa da tenere a mente da parte del programmatore o futuro programmatore è la seguente:
Un computer fa quello che gli chiedi, non quello che vuoi.
Pertanto, quando scriviamo un appplicazione, dobbiamo essere bravi a chiedere al computer di fare le cose giuste, altrimenti il risultato non sarà quello che desideriamo e il software, non funzionerà. Ma proseguiamo nello spiegare come funziona un applicazione.
L’applicazione (adesso si chiamano APP, ma applicazione, programma o software sono sinonimi) in quanto tale, istanzia uno “spazio” di memoria contenuto e controllato dove lavorare. Quando io ero giovane, molti secoli fa, visto che sono un dinosauro, era possibile alle applicazioni condividere delle aree della memoria fisica del computer, e utilizzare in comune alcune cose, questo al giorno d’oggi non si fa più, non ho mai indagato sul fatto che sia possibile ancora, dubito che sia fattibile sulle device mobili, che hanno sistemi operativi molto paranoici, ma considerato che in 28 anni di programmazione ho smesso di averne bisogno nell’anno 2000 e non l’ho mai rimpianto, direi che non è un problema.
All’interno dell’applicazione, man mano che il codice viene eseguito, vengono creati degli oggetti che sono utilizzati per qualsiasi interazione con l’utente o, nel caso di programmi di tipo servizio, interazione con la macchina e con la rete che ospita il servizio. Gli oggetti possono compiere azioni, creare, modificare, dati e possono essere distrutti quando non più utili.
Ma che cos’è un oggetto in un programma? un oggetto è l’istanza di una classe.
Ahi! capito come prima! Lo so, se è la prima volta davvero è complicato. E la classe che cos’è? La classe è la descrizione dei dati e delle azioni che compongono un oggetto.
E quindi? Facciamo un esempio?
Il più classico, perché tutti ce l’hanno sulla scrivania (almeno per un po’ ancora):
La Penna Biro è un oggetto.
La classe Penna è il progetto disegnato dal progettista della Biro Spa, dove sono rappresentati i componenti con cui la penna è costruita, le loro misure e forme, ed è descritto quello che l’oggetto quando costruito deve compiere.
Le penne Biro assemblate dalla catena di montaggio della Biro Spa, sono delle Istanze della classe Penna.
- La classe è un progetto
- L’istanza della classe è l’oggetto costruito sul progetto, che ha le caratteristiche descritte nel progetto e può compiere le azioni ad esso associate.
La classe penna nel modo più semplificato in un programma C# sarebbe fatta così:
class Penna { public Color Colore { get; set} public PenType Type { get; set} public void Scrive(string parole) { ... } }
La penna è descritta dal suo colore, (Es. Rosso, Nero, Blu, Verde) e dal suo tipo (Es. Sfera, Gel, Stilografica).
Per creare fisicamente la penna, ed utilizzarla, informaticamente parlando dovrei scrivere questo codice:
Penna montBlanc = new Penna(); montBlanc.Color = Colors.Black; montBlanc.Type = PenType.Stilografica; montBlanc.Scrive("Ciao a Tutti");
Penna è una classe, montBlanc è l’oggetto (ovvero un istanza della classe Penna).
Definiamo allora cos’è il Linguaggio C#?
Il C# è una lingua di tipo informatico, che permette di scrivere in linguaggio vicino al linguaggio naturale istruzioni che possono essere utilizzate da un computer per interagire con i suoi utenti.
Essendo una lingua, C# ha un vocabolario formato dalle sue keywords, le parole chiave; una punteggiatura, formata dai segni che permettono di identificare gli oggetti, separare e definire le istruzioni, trasformare in codice le operazioni matematiche e logiche, una sintassi che permette di scrivere le sue istruzioni in modo comprensibile alla macchina che le eseguirà ed all’umano che le scriverà, proverà, correggerà, implementerà, aggiornerà e così via. Inoltre ha una grammatica che decide come il linguaggio debba essere scritto per essere coerente. Tutto questo ci permette di costruire il necessario a fare tutte le meraviglie che i nostri computer, smartphone, tablet, frigoriferi intelligenti, lavatrici a singolo pulsante, sono in grado di compiere. Fra cui le principali sono ovviamente:
Tetris, Pacman, Space invaders… Troppo antichi? Ok: Ruzzle, Candy Crush Saga, Halo, Super Mario…
Com’è fatto?
Come è fatto il linguaggio e come si scrive un programma. Partiamo dalle basi, ogni programma C# contiene almeno una classe,
using System; namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("hello, world!"); Console.ReadLine(); } } }
Questo è il più semplice programma che possa essere scritto in C# il famosissimo Hello World, che ci mostra i fondamentali della sintassi di C# e qualcosa in più, vediamo di elencare quello che ci mostra:
- Ogni programma C# contiene almeno una classe, automaticamente, generando un progetto Console, che è il più semplice dei progetti C# Visual Studio la chiama Program, ma potrebbe chiamarsi con qualsiasi nome, perché la cosa importante in questo caso è il metodo Main. Tale metodo è quello che il sistema operativo va a cercare quando noi lanciamo il nostro programma. Ogni programma C# deve avere un solo Main.
- Una classe è definita utilizzando la Keyword class seguita da un nome che la identifica univocamente. Questo nome, come tutti i nomi di oggetti e strutture all’interno di un programma C# segue le seguenti regole di nomenclatura:
- Deve iniziare con una lettera
- Può contenere lettere maiuscole, minuscole, il carattere _ (underscore) ed anche numeri (ma il primo carattere non può essere un numero).
- Non può contenere spazi, trattini, punti o altri segni di punteggiatura può contenere lettere accentate ma non è auspicabile.
- La classe è definita all’interno delle due parentesi graffe {} che racchiudono i metodi, le variabili, le proprietà, le costanti, ed altri tipi di cose (che vedremo in seguito) che la compongono.
- All’interno di una classe possono essere contenuti principalmente: costanti, variabili, metodi, e altre cose ancora, che però nelle lezioni da principianti non ci servono.
La nostra classe minimalista è composta da un unico metodo, il metodo Main, quanto basta a creare un applicazione funzionante.
- Un metodo è composto da:
- uno o più modificatori che ne stabiliscono la visibilità (scopo) nel caso del nostro programma, il modificatore è static avremo modo nelle prossime lezioni di spiegare che cosa significa il fatto che un metodo sia preceduto da questo modificatore. static è una Keyword per C#.
- un tipo, – in questo caso void – anche in questo caso avremo modo di spiegare che cos’è il tipo di un metodo e a cosa serve e che cos’è il tipo void.
- un nome – in questo caso Main – attenzione alle maiuscole, C# è case sensitive (come tutti i linguaggi C like) quindi main e Main sono due cose diverse.
- Nessuno, uno, o più parametri – in questo caso string[] args – avremo modo di spiegare e capire a cosa servono i parametri nelle lezioni successive.
- Una coppia di parentesi graffe che contengono le istruzioni che compongono il metodo.
- Nessuna, una o più istruzioni che eseguite compongono l’azione che il metodo compie. Le istruzioni possono essere divise in tre gruppi primari:
- Dichiarazioni
- Assegnazioni
- Esecuzione di metodi
- Strutture decisionali
- Tutte le istruzioni, salvo le strutture decisionali classiche, terminano con un ; (punto e virgola) per informare il compilatore così che sia in grado di comprendere dove inizia e dove finisce ogni istruzione.
Il nostro metodo Main, contiene due istruzioni, entrambe sono istruzioni che eseguono un metodo.
La prima istruzione scrive la fatidica frase hello World! su una schermata di tipo Console, la seconda aspetta che l’utente prema il tasto <Invio> per completare il programma, se non c’è scritto invio può esservi scritto Return oppure più probabilmente una freccia ad angolo retto con la punta verso sinistra, il ritorno carrello delle vecchie macchine da scrivere.
Questo è il nostro programma in esecuzione, e quando premiamo invio, termina e chiude la finestra console.
Potrei terminare qui l’esposizione di come è fatto un programma C# ma sono certa che tutti voi, osservando il codice abbiate notato due cose di cui non ho ancora parlato, esattamente queste:
using System;
ed anche
namespace HelloWorld {
....
}
Cosa sono questi due ulteriori elementi inseriti nel codice C# del nostro programma? Prima di tutto la clausola using System è la prima che utilizzeremo, e vedremo come, proseguendo nello sviluppo, le nostre classi si arricchiranno di più di una di queste dichiarazioni. Ma cosa sono?
la sintassi esatta di una clausola using è la seguente:
using ALIAS=Namespace;
dove ALIAS è un nome abbreviato (che può essere vuoto, come nel nostro caso), e Namespace è uno dei namespace che contengono le classi del nostro programma o, come in questo caso, del Framework .net che utilizzeremo all’interno della classe e vogliamo chiamare con il nome più breve possibile.
Pertanto, la clausola using un altra delle keyword di C# può apparire solo all’esterno della clausola namespace ma è collegata alla clausola namespace.
Se non includessimo la clausola using System nella nostra classe, le istruzioni che compongono il nostro Hello World diventerebbero:
System.Console.WriteLine("hello, world!"); System.Console.ReadLine();
Quindi potete intuire che using è un sistema per abbreviare i riferimenti ai namespace che compongono una applicazione, è un sistema per creare degli alias per rendere meno verboso il codice, una specie di “stenografia” se vogliamo definirla così.
Ma cos’è un namespace, a cosa serve, perché utilizzarlo. Il namespace sulle traduzioni in italiano è tradotto con Spazio dei Nomi che per quanto letterale, da principio fa molta confusione. E’ un sistema per organizzare le classi che compongono i nostri programmi in modo logico, coerente e in modo tale che l’IDE di Visual Studio ci possa aiutare a trovare rapidamente le nostre classi senza che dobbiamo ricordarcene il nome esatto. Possiamo paragonarlo ad un sistema di cartelle, ed in effetti, quando scrivete un programma in Visual Studio, se create delle sottocartelle per custodire le vostre classi, quando aggiungete una nuova classe ad una cartella, il suo namespace sarà composto dal Root Namespace, che avrete impostato per il progetto più il nome della sottocartella in cui avete creato la classe.
Facciamo un esempio pratico per comprendere: Quando il nostro progetto contiene solo una classe, come nel nostro esempio, il Namespace potrebbe anche non essere usato, perché non è difficile trovare le classi. Ma se iniziassimo a sviluppare una applicazione con Finestre, Classi per la gestione dei dati, Classi per lagestione della grafica, immagini per i bottoni dei menu, ed altre risorse, se creassimo un unico calderone contenente tutto quanto, il nostro programma diventerebbe difficile da manutenere nel tempo, perché sarebbe difficile ricordarci come abbiamo organizzato le classi.
I namespace ci aiutano a costruire una struttura ad albero ove inserire le nostre classi che permette di organizzarle in modo logico e coerente.
Il framework .net, che Microsoft ci mette a disposizione per creare le nostre applicazioni, è un insieme di classi enorme, diviso in varie .dll (librerie) che contengono ogni genere di classi di base che ci permettono di costruire le nostre applicazioni senza dover sviluppare tutto dal nulla (anche se volendo potremmo), i namespace in cui sono organizzate le classi, ci permettono di trovare le classi che ci servono anche senza sapere esattamente dove sono, grazie a intellisense e all’ object browser di Visual Studio.
Vi faccio un esempio semplice: Se volessimo creare una applicazione in grado di leggere dei file dal disco e scrivere dei file sul disco, non dobbiamo scrivere manualmente tutto quello che serve per aprire un file, leggere il suo contenuto, oppure scrivere il suo contenuto, e poi chiuderlo. il framework ha una serie di classi apposite che si trovano nel namespace: System.IO
Le più usate sono System.IO.File, System.IO.Path, System.IO.Directory; sono delle classi cosiddette “helper” e vedremo nelle lezioni successive alla serie per i principianti cosa significa, forniscono già pronti, i metodi per leggere e scrivere un file, leggere il contenuto di una cartella, comporre il nome di una cartella, creare la cartella e così via.
Il namespace ha anche un altro compito, quello di permetterci di creare delle classi con lo stesso nome ma funzionalità diverse in namespace diversi.
Un esempio abbastanza lineare potrebbe essere: creare due classi dati per gestire una tabella dati su SqlServer e su Mysql, creare due diversi namespace per creare le classi dati che lavorano con i due diversi database ed hanno lo stesso nome.
Un esempio molto diverso, ma comunque interessante sono le classi del framework Path, ve ne sono due, una System.IO.Path fornisce una serie di servizi per esplorare le cartelle del disco, mentre System.Windows.Shapes.Path è una classe che permette di disegnare forme vettoriali.
Ricapitolando
C# è un linguaggio comprensibile agli esseri umani che permette di scrivere codice comprensibile ai computer.
C# è un linguaggio OOP (Object Oriented) pertanto lavora utilizzando degli oggetti.
Un programma scritto in C# è composto da almeno una classe.
La Classe è il progetto che permette di costruire un oggetto, l’oggetto è un istanza di una classe.
Ogni Programma C# per convenzione ha un metodo Main che è il primo ad essere eseguito.
Il Framework .net, è una libreria con centinaia di classi già scritte che possiamo utilizzare nel nostro codice.
Potete scaricare il progetto esempio dal link qui indicato:
Companion code, Lezione 1 – Cos’è C#
Per qualsiasi domanda, approfondimento, commento, o per segnalare un errore potete usare il link al modulo di contatto in cima alla pagina.