Introduzione al linguaggio C# - Roberto Mana

Pagina creata da Davide Carrara
 
CONTINUA A LEGGERE
Introduzione al linguaggio C# - Roberto Mana
Informatica - Classe Terza                                                                             robertomana.it
                                          Introduzione al linguaggio C#

                     Introduzione al linguaggio C#
                                                                                                Rev. Digitale 1.2 del 18/11/2017

Introduzione al Linguaggio C#
Il NET Framework ……………………..……………………………………………………….………                                                               3
Le variabili ……………………………………………………………………………………….……..                                                                4
Istruzioni Fondamentali ………………………………..…………………………………..……………                                                         5
Introduzione a vettori e matrici ………….……..…………………………………..……………………                                                  7
Le strutture ……………………………………..…………………………………..……………………                                                               7
Introduzione alla programmazione OOP ………..…….………………………………….…………….                                                  8

Le classi base del NET Framework
System.Math ……………………………………………………………..……………………………                                                                  11
Classi numeriche ………………………………..........................................…………………………..                               11
System.Convert …………………………………...........................................………………………..                                11
System.Char ……………………………………...........................................…………………………                                   12
System.Random ……………………………………..............................................…………….…….                               13
System.String …………………………………….............................................……………………….                               13
Il cast dei puntatori …….…………………………………………………………………………..…...                                                       15
Sintassi completa di MessageBox e InputBox ………………………………………………………...                                               16
Gestione delle Eccezioni Strutturate …………..…………….……………………………..………….                                               17
Passaggio dei parametri per riferimento …………..…………….…………………………..………….                                             19
Approfondimenti su Vettori e Matrici ………..……………….…………………..………………….                                                19
Files e Directories ……………………………………………………………………..…..…………..                                                         21

La classe Form
Proprietà di una Form ………………………………………………………………………………….                                                            24
Richiamo di una API di Windows dall‟interno di una Form .………………………………..………..                                      24
Ciclo di vita di una Form ……………………………………………………………………………….                                                         25
I Controlli …………………………..…………………………………………………………..……..                                                              25
     Principali Eventi Relativi alla Tastiera …………………………………………………………...                                           27
     Principali Eventi Relativi al Mouse ……………………………………………………..……….                                               28
     La Gestione del Fuoco ……………………………………………………………….…………..                                                        29
Scansione di controlli simili ………………………………………………………………..…………                                                      30
Creazione Dinamica dei Controlli ………………………………………………………..…………..                                                    31
La classe system.windows.form ……………………………………………………………………….                                                        33
Utilizzo degli oggetti Shapes ………………………………………………………………………….                                                       34

I controlli Visuali
Text Box, Label …………………………………………………………………………………….…… 35
Command Button, Check Box, Option Button, Panel, GroupBox …....................................................... 36
List Box, Checked List Box, Combo Box ……………………..................................................………. 37
Timer ……………………………………………………………………………………….…………… 38
DataGridView ………………………………………….................................................……………… 39
Picture Box, Scroll Bar, Link Label …………………...............................................………………… 40
Menù ………………………………………………………………….………………….…………… 41
Dialog Box …………………………………………………………………………………..………… 42
La Stampa ………………………………………………………………………………………………. 44
Status Bar e Tool Bar …………………………………...…............................................…………….. 46
ImageList …………………………………………………..............................................……….…… 47
Rich Text Box ………………………………………………..............................................………….. 47
I Controlli Provider: ToolTip, ErrorProvider, HelpProvider …...............................................……….. 48
Altri Controlli ……………………………………………….…………………………………………. 50

                                                                                                                         pag 1
Informatica - Classe Terza                                          robertomana.it
                             Introduzione al linguaggio C#

Gli oggetti non visuali
L‟oggetto Application ………………………………………………………………………………….                        52
L‟oggetto Font …………………………………………………………………………………..……..                          52
L‟oggetto Color …………………………………………………………………………..……..…….                         53
Richiamo di Applicatvi Esterni …………………………………………………………………..…….                 53
L‟oggetto.Date ………….……………….…………………………………………………….………                           54
L‟oggetto Clipboard ………………………………………………………………………..………….                        56
L‟oggetto Cursor ………….………………………………………………………………..………….                         56
L’oggetto Enum ………….…………………………………………………………………………….                            57
L‟oggetto Array ……………………………………………………………………………..………….                          58
Gòi oggetti Collections: List, Stack, Queue, Hashtable ………..………………………………………   60
Trascinamento con il mouse ……………………………………………………………………………                      63

                                                                                   pag 2
Informatica - Classe Terza                                                                        robertomana.it
                                        Introduzione al linguaggio C#

                                              Il NET Framework
Compilazione delle applicazioni tradizionali
Terminato lo sviluppo dell‟applicazione, questa deve essere compilata per creare un file binario detto eseguibile.
Tutte le librerie utilizzate dalla‟applicazione vengono linkate staticamente all‟applicazione al momento della
creazione. Pertanto l‟eseguibile contiene al suo interno tutte le librerie necessarie alla sua esecuzione e qpuò
essere eseguito su qualunque macchina senza ulteriori installazioni.

Concetto di DLL (Dynamic Link Library)
Col passare degli anni le funzioni utilizzate da un programma aumentano sempre di più e diventa impossibile
contenerle tutte all‟interno di un unico eseguibile. Nasce il concetto di DLL. Molto funzionalità di base (ad
esempio le funzioni di input / output, le funzioni di gestione delle finestre grafiche, le funzioni di accesso ai file)
vengono memorizzate all‟interno di DLL esterne che devono essere distribuite insieme all‟applicazione.
Una DLL può essere vista come una classe compilata. Se invece di compilare un „intero progetto dotato di main si
compila una singola classe sprovvista del main, invece di un file eseguibile viene creata una libreria (detta DLL)
simile all‟eseguibile ma che non può essere eseguito autonomamente.
La DLL sono pertanto librerie binarie che verranno collegate dinamicamente all‟eseguibile soltanto in fase di
RUN TIME. Quando si crea un progetto che intende utilizzare una DLL, è sufficiente indicare nel progetto il path
del file contenente la DLL. Al momento dell‟esecuzione, quando l‟eseguibile avrà necessità di accedere ad una
funzione contenuta all‟interno della DLL, provvederà autonomamente a caricare in memoria la DLL, linkarla
dinamicamente al progetto ed eseguire la specifica funzione richiesta. Una stessa DLL può essere
contemporaneamente utilizzata da più processi.
Molte DLL utilizzate in un certo ambiente di sviluppo vengono installate sulla macchina al momento
dell‟installazione dell‟ambiente di sviluppo. Quando poi l‟utente sposta l‟eseguibile su un‟altra macchina
l‟eseguibile non funziona perché manca qualche DLL. Non sempre è facile recuperare le DLL mancanti, e
nemmeno di può pensare di reinstallare sulla macchina del cliente finale l‟intero ambiente di sviluppo.

Il NET Framework [300 MB]
Tre grandi innovazioni:
1) Tutte le DLL necessarie all’esecuzione Run Time sono raccolte all’interno del NET Framework, in modo
che, quando si distribuisce una applicazione, non ci sia più la necessità di portarsi dietro tutte le DLL ma, sul
nuovo PC, sarà sufficiente installare il NET Framework, scaricabile gratuitamente dal sito Microsoft.
Siccome esistono versioni differenti di Visual Studio che utilizzano NET Framework differenti, occorre fare
attenzione ad installare sul PC del cliente finale la stessa versione di NET Framework utilizzato per lo sviluppo:
   Visual Studio 2002     -> Framework 1.0
   Visual Studio 2003     -> Framework 1.1
   Visual Studio 2005     -> Framework 2.0
   Visual Studio 2008     -> Framework 3.0 (ad oggi Gennaio 2010 siamo alla release 3.5 di Visual Studio 2008)
2) L‟applicazione finale non comunica direttamente con il SO, ma comunica solo con il NET Framework, per cui
diventa portabile su qualunque SO per i quali è disponibile la versione adeguata del NET Framework.
3) Il compilatore, a differenza dei tradizionali linguaggi di prg, non genera codice nativo binario (eseguibile
direttamente dalla CPU), ma genera il cosiddetto MsIL (Miscosoft Intermediate Language). A differenza di java
che è interpretato, in NET quando una applicazione viene lanciata, essa richiama direttamente una DLL (MsCorEE)
(run time manager di NET) che contiene un compilatore Just in Time (compilatore JIT) il quale provvede a
compilare il codice intermedio in codice nativo eseguito sulla CPU. Ogni procedura viene compilata soltanto quando
viene richiamata per la prima volta, senza appesantire il tempo di lancio. Inoltre la compilazione Just in Time può
ottimizzare il codice sulla base del SO su cui viene eseguita.

                                                                                                                   pag 3
Informatica - Classe Terza                                                                       robertomana.it
                                        Introduzione al linguaggio C#

                                                   Le Variabili
I tipi che iniziano con la lettere Maiuscola rappresentano le classi native del NET Framework.
I tipi che iniziano con lettera minuscola rappresentano le varabili scalari boxate per C#

    Classe            scalare VB         scalare C#
    Byte              Byte               byte              1 byte        Numerico 0 - 255
    Char              Char               char              2 byte        chr UNICODE. No valore numerico
    Int16             Short              short             2 byte         ± 32000
    Int32             Integer            int               4 byte         ± 2 Mld
    Int64             Long               long              8 byte         ± 9 Mld di Mld
    Single            Single             float             4 byte
    Double            Double             double            8 byte
    Boolean           Boolean            bool              2 byte        True = -1, False = 0
    String            String             string            10 byte +     2 * char (1 Mld Char)
    Date              Date               date              8 byte        Dal 1 1 0001 al 31 12 9999
    Object            Object                               4 byte        Riferimento a oggetto (void *)

       String e Date sono degli Oggetti che, per comodità, sono istanziabili anche senza il new.
        Le variabili string non sono accessibili in scrittura diretta ma solo in concatenamento.
        Tutti i metodi che modificano la stringa in realtà istanziano e restituiscono una nuova stringa
Il vecchio standard ANSI ad un byte per carattere è sostituito dallo standard UNICODE. Lo standard ANSI ad un
byte prevedeva 256 simboli, di cui i primi 128 erano fissi (codici ASCII) mentre i 128 successivi dipendevano
dall‟applicazione (e dalla lingua). Lo standard UNICODE prevede invece 65536 caratteri fissi, contemplando
tutti i possibili caratteri (ad esempio il codice 12398 rappresenta il carattere N in giapponese). Nei 10 caratteri di
intestazione viene memorizzata la lunghezza della stringa. Non sono supportate le stringhe a lunghezza fissa.

Dichiarazione delle variabili
Stessa sintassi dell‟ANSI C.
Per i nomi delle variabili si consiglia la notazione camel Casing del tipo nomeCognomeIndirizzo,
con la 1° lettera minuscola e le iniziali delle parole successive Maiuscole.

Sono consentite Dichiarazioni multiple su una stessa riga:               int a, b, c

Variabili di blocco
E‟ consentita la dichiarazione di variabili direttamente all‟interno di un blocco di istruzioni (Variabili di blocco).
Se però la variabile viene inizializzata e la dichiarazione si trova all‟interno di un ciclo, allora l‟inizializzazione
viene ripetuta tutti i giri.
              for (int i = 0; i < 100; i++) {
                   int a=0;
                   a = a+i;
               }   // a = 99

Per evitare questo problema l‟inizializzazione può essere eseguita all‟interno del ciclo for:
               for (int a =0,      i = 0; i < 100; i++) {

Attenzione che non è possibile riutilizzare il nome di una variabile già esistente all‟interno della procedura (errore
di compilazione). E‟ invece consentito avere una variabile di blocco con lo stesso nome di una variabile globale.
Attenzione anche al fatto che il tempo di vita della variabile di blocco coincide con quello dell‟intera procedura.
Se si ripassa una seconda volta nel blocco, la variabile viene reinizializzata al valore di inizializzazione ma,
 in assenza di inzializzazione esplicita, la variabile mantiene il valore che aveva in uscita dal blocco.

                                                                                                                  pag 4
Informatica - Classe Terza                                                                      robertomana.it
                                        Introduzione al linguaggio C#

Le costanti
Non sono supportate le define, ma la costante viene dichiarata come se fosse una variabile semplicemente
anteponendo la parola chiave const davanti. Anche le constanti vengono allocate in memoria.
        const int n = 3;
        const string s = "Salve mondo";

Lettura e Scrittura su Console
        String s;
        s = Console.readLine();                // legge una stringa da tastiera
        Console.write(s);                      // scrive la stringa s senza andare a capo
        Console.writeLine(s);                  // scrive la stringa s e va a capo

Parametri opzionali in una funzione
Per rendere opzionale un parametro all‟interno di una funzione è sufficiente specificare un valore di default
int modifica (int paramObbligatorio , int paramOpzionale = 0)

Variabili static
In C# non sono supportate le variabili statiche all‟interno di un metodo. Al loro posto si usano i metodi statici.

                                          Istruzioni Fondamentali
Operatori
Aritmetici
+ * - / La divisione fra interi tronca all‟intero più basso
%     Resto della divisione fra interi
Logici
&&      ||    !
Nel caso della And, se il primo test fallisce, i test successivi non vengono eseguiti.
Nel caso della ||, se il primo test è vero, i test successivi non vengono eseguiti.
Confronto
==   !=   >        >=      <
Informatica - Classe Terza                                                                      robertomana.it
                                         Introduzione al linguaggio C#

L’istruzione switch
                 int n = 2;     string s = "aa";
                 switch (n) {
                     case 1:
                     case 2:
                         MessageBox.Show("uno or due");
                         break;
                     default:
                         MessageBox.Show("other");
                         break;
                 }

                 switch (s) {
                     case "aa":
                          MessageBox.Show("aaa");
                          break;
                     case "bb":
                         MessageBox.Show("bbb");
                         break;
                     default :
                         MessageBox.Show("other");
                         break;
                 }

         A differenza di ANSI C la variabile da confrontare può essere di qualunque tipo, compreso STRING.
           (in ANSI C erano ammessi solo int e char)
         A differenze di ANSI C ogni blocco case contenente delle istruzioni deve essere chiuso mediante un
          break, altrimenti si verifica un errore in compilazione. Anche il default deve essere chiuso da un break.
         Purtroppo a differenze di VB dopo ogni singolo case può essere specificato sempre solo un UNICO
          valore. Non è possibile fare delle OR o delle AND o impostare degli intervalli.

I Cicli
for (i=1;   i
Informatica - Classe Terza                                                               robertomana.it
                                       Introduzione al linguaggio C#

                                          Introduzione ai Vettori
Sono a base 0, cioè partono da 0 e vanno fino a N -1.
Devono essere trattati come oggetti, per cui non è ammessa la tipica dichiarazione
         int vect[10];                  „Errore di sintassi

Occorre invece utilizzare la seguente sintassi :
         int [] vect1;                           // equivale all‟ANSI C int * vect1
         vect1 = new int[10];
         int [] vect1 = new int[10];
for (int i = 0; i < 10; i++)                  vect1[i] = i;
         In caso di inizializzazione diretta occorre omettere la dimensione
         int [] vect2 = new int [] { 0, 1, 2, 3, 5, 8, 13 };
         In questo caso anche il new può essere omesso:
         int [] vect2 = { 0, 1, 2, 3, 5, 8, 13 };
         E‟ ammesso l‟utilizzo di una variabile per definire la dimensione:
         int n = 10;    int[] vect3 = new int[n];

Le Matrici
int[,] mat = new int[2,3];
// Matrice di 2 righe x 3 colonne, entrambe a base 0.
// Anche la matrice può essere inizializzata in fase di dichiarazione:
int[,] mat = {{11, 12, 13}, {21, 22, 23}};

.Length Proprietà ReadOnly = Restituisce il numero complessivo di elementi contenuti nella matrice,
conteggiando però l‟intero rettangolo
.GetLength(0) Proprietà ReadOnly = Restituisce il numero di righe
.GetLength(1) Proprietà ReadOnly = Restituisce il numero di colonne (2° dimensione)
      for (int i = 0; i < mat.GetLength(0); i++)
          for (int j = 0; j < mat.GetLength(1); j++)
               MessageBox.Show(mat[i, j].ToString());

                                                  Le Strutture
Come in ANSI C, in C#, le strutture, a differenza delle classi,
    sono considerate variabili di tipo scalare quindi non serve il new
    non sono ereditabili.
All‟interno di una struttura è possibile definire Variabili ma anche funzioni.
I membri di una struttura possono essere Private (default) oppure Public.
 struct s_Libri {
       public int codice;       // non sono consentite le inizializzazioni
       public string autore;
       public string titolo;
       public string visualizza() {
            string s = codice.ToString() + " " + autore + " " + titolo;
            Console.Write(s);   return s;
       }
 };
                                                                                                      pag 7
Informatica - Classe Terza                                                                       robertomana.it
                                        Introduzione al linguaggio C#

Dichiarazione di un record e inserimento dei dati
      s_Libri libro;        // struct DEVE essere omesso
      libro.codice = 3;
      libro.autore = "Pirandello";
      libro.titolo = "Uno nessuno centomila";
      libro.visualizza();

Operazioni sui record
Come in ANSI C non è consentito il confronto fra record, che devono essere confrontati sui singoli campi.
Essendo variabili scalari, i record possono essere copiati con la semplice assegnazione: libro2 = libro1;
Notare che così facendo ogni campo di libro1 viene duplicato all‟interno di libro2, comprese le stringhe, per le
quali, come detto è stato ridefinito l‟operatore di assegnazione (il setter) che ogni volta istanzia una nuova stringa.

                 Introduzione alla Programmazione Object Oriented
Paradigma = Modello utilizzato per affrontare / risolvere un problema

Paradigma Imperativo: Esprime la strategia risolutiva di un problema attraverso una successione sequenziale di
comandi ed un controllo di stati (es. Continua a ciclare fino a quando non arriva un numero negativo).

Paradigma della programmazione ad oggetti Nuova modalità di progettazione delle applicazioni. Non si pensa
più a quale sequenza di operazioni è necessaria, ma a quali oggetti sono necessari. Risoluzione dei problemi
mediante la costruzione di oggetti dedicati. OOP esprime la strategia risolutiva di un problema attraverso una
generalizzazione della progettazione di oggetti riutilizzabili: Essa parte dalla costruzione di oggetti elementari per
costruire via via oggetti sempre più complessi (estensibilità del codice).

Introduzione agli oggetti
Un oggetto può essere inizialmente visto come un contenitore che comunica con l‟esterno mediante un insieme di
proprietà, metodi ed eventi. Il main (programma principale) rappresenta l’utilizzatore dell’oggetto.
                        Proprietà
                                                                              Eventi
                        Metodi

Le Proprietà sono “variabili” definite all'interno dell'oggetto.
I Metodi sono “funzioni / procedure” definite all'interno dell'oggetto che operano sulle Proprietà
Gli Eventi rappresentano una nuova caratteristica della programmazione ad oggetti. Sono procedure richiamate
automaticamente quando si verifica una particolare situazione dovuta ad una causa interna (ad esempio allo
scadere di un certo timeout) oppure in conseguenza di eventi esterni come ad esempio il click del mouse.

Per accedere da codice ai membri di un oggetto di usa l‟operatore . (puntino ), esattamente come per i record
Es:     myLibro.titolo = “I Promesi Sposi”;

Definizione di CLASSE
Le classi costituiscono la base della programmazione ad oggetti. Si supponga di dover rappresentare e gestire una
certa realtà (ad es la biblioteca di una scuola). Una classe è una porzione di codice (contenuta normalmente in un
apposito file .cls) contenente un insieme di dati (cioè le PROPRIETA’: Titolo del libro, Autore, Casa Editrice)
più il codice di elaborazione dei dati stessi (cioè i METODI che agiscono sui dati. Ad esempio un Motodo per
l‟aggiunta di un nuovo libro oppure per la gestione di un prestito). Una Classe definisce le caratteristiche (cioè
Proprietà, Metodi ed Eventi) dell'oggetto, esattamente come la struttura definisce le caratteristiche dei record. Es:

                                                                                                                 pag 8
Informatica - Classe Terza                                                                      robertomana.it
                                       Introduzione al linguaggio C#

class Libro {     // Le classi si scrivono con la prima lettera Maiuscola
      public int codice;
      public string Titolo;
      public void salvaSuFile() {
                // Codice per salvare su file il libro corrente (codice e titolo)
         }
}
Gli EVENTI sono particolari metodi (metodi di evento) che non devono essere richiamati dall‟utente della classe
(main) ma che vengono eseguiti automaticamente in corrispondenza di situazioni interne al programma o esterne.

Definizione di OGGETTO
Un oggetto rappresenta una istanza della classe, cioè la sua allocazione in memoria.. Nel caso delle classi non
si parla più di allocazione ma di ISTANZA. In genere si parla più frequentemente di oggetto che non di classe.
La classe può essere vista semplicemente come codice di definizione dell‟oggetto.
Per poter utilizzare la classe Libri, l'applicazione dovrà prima creare una istanza mediante l‟operatore new:
   Libro mioLibro;
   mioLibro = new Libro(); // sempre con le parentesi
La prima riga crea un riferimento (puntatore) ad un oggetto di tipo Libro non ancora esistente in memoria.
Questo riferimento contiene pertanto il valore null (che in C# significa puntatore non inizializzato).
La seconda riga, mediante l‟operatore new, crea una nuova istanza della classe Libro e restituisce il puntatore
all‟oggetto che viene copiato all‟interno della variabile mioLibro.
Esattamente come in C i Riferimenti (cioè i Puntatori), pur essendo sempre indirizzi, sono TIPIZZATI.
Cioè un puntatore può essere dichiarato come Puntatore generico oppure come Puntatore ad uno specifica classe:
                            ANSI C                                   C#
    Generico                void * pt;                               Object pt;
    Tipizzato               Libro * mioLibro;                        Libro mioLibro;
E‟ anche possibile Dichiarare un Riferimento e Istanziare l‟Oggetto all'interno della stessa riga:
   Libro mioLibro = new Libro(); // sempre con le parentesi
Per accedere da codice ai membri di una classe si usa il nome del puntatore seguito dall‟operatore puntino
mioLibro.codice = 65
mioLibro.salvaSuFile()

Riassumendo :
Classe = Codice Descrittivo di un oggetto (template)
Oggetto =Istanza in memoria della Classe.

Visibilità
I membri di una classe (Proprietà, Metodi ed Eventi) possono essere definiti come Private (default), cioè visibili
solo all‟interno di una classe, oppure Public, cioè visibili anche all‟esterno della classe.

Le TRE caratteristiche di una classe
Incapsulamento : Una classe è l‟unica proprietaria dei suoi dati. I Dati sono memorizzati in un‟area di memoria
non direttamente accessibile alle altre porzioni di programma. La classe può controllare il valore assegnato alle
variabili interne prima che i valori stessi vengano memorizzati, con la possibilità di rifiutare valori non validi.
L‟incapsulamento consente di modificare il funzionamento della classe senza interagire con l‟applicazione esterna
Ereditarietà : Da una classe già esistente è possibile derivare una nuova classe (classe derivata) che erediti
proprietà e metodi della classe base con possibilità di aggiungere nuove funzionalità. Riutilizzo del software.
Polimorfismo : Più classi completamente diverse possono mostrare all‟esterno interfacce simili cioè proprietà e
metodi con lo stesso nome e la stessa firma. Facilità di utilizzo e possibilità di gestire gruppi di controlli con una
unica variabile ad esempio di tipo Control.
                                                                                                                pag 9
Informatica - Classe Terza                                                                     robertomana.it
                                       Introduzione al linguaggio C#

Esempio di progetto OOP
Realizzare un programma per il calcolo degli interessi che si avranno al termine di un investimento pluriennale.
Utilizzando OOP cambia completamente la strategia risolutiva. I problemi si risolvono non più attraverso una
analisi sequenziale, ma attraverso l’individuazione e la realizzazione di appositi oggetti.
Non si pensa più a quale sequenza di operazioni è necessaria, ma a quali oggetti sono necessari
a) Approccio sequenziale ::
   1. Leggere il capitale iniziale
   2. Leggere il tasso di interesso annuo
   3. Leggere la durata dell‟investimento espresso in anni
   4. Fare un ciclo per il calcolo degli interessi annuali
   5. Visualizzare il risultato
b) Approccio OOP ::
   1. Creare una classe Investimenti
   2. Impostare le Proprietà capitaleIniziale, interesseAnnuo, durata
   3. Richiamare l‟apposito metodo eseguiCalcolo( )
   4. Leggere e Visualizzare il risultato
Nella OOP il passo iniziale è individuare e costruire gli oggetti necessari alla soluzione del problema e quindi
spostare tutta la logica all‟interno della classe. Nel caso precedente si avrà il seguente codice:
 class Investimenti {
      public int capitaleIniziale;
      public int interesseAnnuo;
      public int durata;
      private double risultato;
      public double eseguiCalcolo( ) {
          risultato = capitaleIniziale;
          for (int i = 0; i < durata; i++)
                 risultato += risultato * interesseAnnuo / 100;
          return risultato;
      }
int Main( ) {
        Investimenti investimento = new Investimenti();
        investimento.capitaleIniziale = Convert.ToInt32(InputBox("Inserire capitale Iniziale"));
        investimento.interesseAnnuo = Convert.ToInt32(InputBox("Inserire Interesse Annuo"));
        investimento.durata = Convert.ToInt32(InputBox("Inserire Durata"));
        double ris = investimento.eseguiCalcolo( );
        MessageBox.Show (ris.ToString());
}
L‟approccio OOP è sicuramente più oneroso nel caso di piccole applicazioni, ma è sicuramente vantaggioso nel
caso di applicazioni di dimensioni notevoli, in cui, una volta stabilite le specifiche della classe, gruppi di lavoro
differenti possono contemporaneamente dedicarsi allo sviluppo di oggetti differenti ed eventualmente riutilizzabili

Membri di Istanza e Membri Statici di una classe
Una classe può avere :
    proprietà e metodi di istanza, cioè legati alle istanze della classe, e richiamati tramite il nome dell‟istanza
       ES: mioLibro.metodoDiIstanza( ); oppure mioLibro.salvaSuFile();
       proprietà e metodi statici (o di classe), cioè che non dipendono dalla singole istanze, ma dalla classe vera e
        propria, e vengono richiamati non tramite il nome dell‟istanza ma direttamente tramite il nome della classe
        ES: Libro.MetodoStatico( ); oppure                         int nLibri = Libro.count;
In corrispondenza del primo accesso ad un membro statico, la classe viene caricata in memoria e da quel momento
tutti i suoi membri statici diventano accessibili (come le funzioni di libreria della programmazione sequenziale).

                                                                                                              pag 10
Informatica - Classe Terza                                                                    robertomana.it
                                        Introduzione al linguaggio C#

Classi Statiche [Per definire una classe statica è sufficiente definire il costruttore come privato]
a) contengono soltanto membri statici (libreria di funzioni)
b) non possono essere istanziate esplicitamente.

In DOT NET ogni cosa è un oggetto. Esempi :
Classi statiche: Math, ControlChars. Sono le più semplici perchè possono essere utilizzate senza essere istanziate
User Class Classi definite dall'utente all'interno dell'Applicazione. (es ClsLibri)
Form Class. Oggetto che sta alla base della programmazione visuale .
I controlli sono particolari Classi che possono essere istanziate soltanto all'interno di una Form .

                                 Le classi base del NET Framework

La classe Statica System.Math
Sqrt (Num) As Double           Restituisce la radice quadrata di un numero. In caso di numero negativo, anziché
                               sollevare una eccezione, restituisce il valore speciale NaN. Esempio:
                               double ris = Math.Sqrt(a);
                        if (double.IsNaN(ris) == true)
                              MessageBox.Show("Not a Number");
                        else
                              MessageBox.Show("OK");
Abs (Num) As Double     Restituisce il valore assoluto di un numero
Sign (Num) As Integer   Restituisce il segno di un numero (+1 per numeri positivi, -1 per i negativi)
Max(Num1, Num2)         Restituisce il massimo fra due valori
Min(Num1, Num2)         Restituisce il minmo fra due valori
Pow(Base, Esp)          Elevamento a potenza : BaseEsp
Round (Num, N) As Double Arrotonda il numero Num con N cifre dopo la virgola. Attenzione che, anche
                           impostando N = 2, il numero 3,00 viene comunque restituito come 3
Ceiling(Num)            Arrotondamento all‟intero superiore
Floor(Num)              Troncamento all‟intero inferiore
Sin (Angolo) As Double         Cos (Angolo) As Double Restituisce seno / coseno di un angolo espresso in radianti
Exp (Num) As Double            Restituisce l‟esponenziale naturale di un numero ex
Log (Num) As Double            Restituisce il logaritmo naturale di un numero
Log10 (Num) As Double          Restituisce il logaritmo in base 10 di un numero
Math.PI       3,1415           Math.E 2,7182

Le classi numeriche (Integer, Short, Long, Single, Double)
Proprietà / Metodi di Istanza
.ToString( )       Converte in stringa. Come primo parametro è possibile passare a ToString una stringhe di
                   formattazione. Come eventuale 2° argomento un oggetto NumberFormatInfo contenente le
                   impostazioni da utilizzare per Separatore Decimale, Separatore Migliaia, etc.
.CompareTo(N1 As Num) Analogo al CompareTo delle Stringhe. Restituisce –1 0 +1 a seconda che il numero
                      corrente sia min, eq o magg di N1. N1 deve essere dello stesso tipo del N corrente.
Proprietà / Metodi Statici
.MaxValue                    Max numero memorizzabile [32.767 su Short] x = Short.MaxValue
.MinValue                    Min numero negativo memorizzabile [-32.768 su Short] x = Double.MinValue

                                                                                                             pag 11
Informatica - Classe Terza                                                                      robertomana.it
                                        Introduzione al linguaggio C#

Per quanto concerne le sole classi Single e Double:
.IsNaN(x)                Restituisce True se la variabile x contiene il valore NaN
.NaN                     Può essere usato in assegnazione: x = Double.NaN
.Epsilon                 Più piccolo numero positivo memorizzabile (risoluzione) Single.Epsilon = 1,4E-45
.tryParse(var, out dest) Se riesce a convertire var in int lo salva nella variabile int dest, altrimenti nulla.

La classe Statica System.Convert
Il cast inline (o direct cast) dell‟ANSI C può essere eseguito soltanto sui tipi base scalari e non sulle stringhe.
La classe Convert, viene utilizzata per convertire un qualsiasi numero in stringa oppure una stringa nella
corrispondente variabile scalare. Può anche essere utilizzata per conversioni scalare scalare, (ad es da int a char),
per le quali però è molto più comodo il cast inline.
Di seguito sono riportate i principali metodi di conversione contenti nella classe Convert.
string s;
Convert.ToInt32 (s)              // arrotondano tutte all‟intero più vicino
Convert.ToInt16 (s)
Convert.ToInt64 (s)
Convert.ToSingle(s)
Convert.ToDouble (s)
Convert.ToBoolean (s)            // 0 -> False, altrimenti True
Convert.ToChar (s)               // var deve essere lunga 1 solo carattere
Convert.ToByte (s)
Convert.ToDateTime (s)           // string s = "30/8/2011";
Convert.ToString (var)
Tutti questi metodi accettano come 2° parametro un oggetto NumberFormatInfo per l‟impostazione del formato.
Funzionano solo i con i valueType (lettera iniziale minuscola) e non con le classi (lettera iniziale Maiuscola)

La classe System.Char
Il tipo char è analogo a quello dell’ANSI C.
L‟unica differenza è che non si può assegnare un valore numerico ma solo il carattere ASCII: char c = „a‟;
La classe Char dispone inoltre dei seguenti metodi statici:che possono tutti ricevere come parametro
o un carattere char oppure un singolo carattere all‟interno di una stringa.
.IsDigit(char c)               Restituisce True se il carattere è un carattere numerico.
.IsDigit(string s, int pos)    Restituisce True se il carattere alla posizione pos è numerico
.IsNumber (char c)             Uguale a IsDigit
.IsLetter (char c)             Restituisce True se il carattere è una lettera
.IsLetterOrDigit (char c)      Restituisce True se il carattere è una lettera o un numero
.IsUpper (char c)              Restituisce True se il carattere è una lettera maiuscola
.IsLower (char c)              Restituisce True se il carattere è una lettera minuscola
.IsWhiteSpace (char c)         Restituisce True se il carattere è uno spazio
.IsPunctuation (char c)        Restituisce True se il carattere è una punteggiatura
.IsSymbol (char c)             Restituisce True se il carattere è un simbolo stampabile
.IsControl (char c)            Restituisce True se il carattere è un carattere di controllo (Ascii < 32)
Tutti questi metodi presentano una seconda firma metodo(s, i) in cui il primo parametro è una stringa, mentre
il secondo parametro consente di eseguire il controllo sul carattere i-esimo della stringa s.
.ToUpper (char c)              Restituisce il carattere c convertito in maiuscolo
.ToLower (char c)              Restituisce il carattere c convertito in minuscolo

                                                                                                                pag 12
Informatica - Classe Terza                                                                        robertomana.it
                                          Introduzione al linguaggio C#

La classe System.Random
.Next(A, B) Restituisce un numero intero compreso tra A (compreso) e B (escluso)
.NextDouble( ) Restituisce un numero double compreso tra 0 (compreso) e 1 (escluso)
.NextBytes (vectBytes) Riempie il vettore (indipendentemente dalla sua lunghezza) con numeri tra 0 e 255
     Random rnd = new Random( );
     int n;
     n = rnd.Next(A, B+1);
         Se al costruttore non viene passato nessun parametro, la sequenza risulta perfettamente casuale (legata a
          data e ora attuali).
         Se invece al costruttore si passa un numero Int16, verrà generata una ben precisa sequenza ripetuta ad
          ogni lancio del programma (sequenza che dipende dal numero impostato).
         Se A == 0 può anche essere omesso.

La classe System.String
In C#, come in VB, la Stringa è un Oggetto per il quale è stato ridefinito l‟operatore di assegnazione.
Cioè l‟assegnazione s2 = s1 non copia il puntatore s1 dentro s2, ma istanzia un nuovo oggetto all‟interno del quale
viene copiato il contenuto di s1 e poi si assegna a s2 l‟indirizzo di questo oggetto.
Per istanziare una stringa si possono utilizzare indifferentemente le seguenti sintassi
     string s;
     string s = new string(“salve mondo”);
La prima sintassi richiama implicitamente un costruttore privo di parametri.
La seconda sintassi, per non creare confusione, è utilizzabile soltanto con costruttori dotati di parametri.

In C# come in Java l’oggetto string è un oggetto invariante (immutable cioè non modificabile).
I vari metodi di elaborazione delle stringhe (ad esempio il metodo replace) restituiscono in realtà un puntatore ad
una nuova stringa.
Per modificare una stringa si possono adottare diverse „strategie‟. Le migliori sono le prime 2:
        riassegnare il vecchio puntatore alla nuova stringa:
         s = s.Replace('v', 'x');
        costruire una nuova stringa con concatenamenti successivi
         s = s + “*”;
        convertirla in un vettore di caratteri
         Le stringhe possono essere convertite nel vecchio vettore di caratteri dell'ANSI C e viceversa.
         Il vettore di caratteri presenta però l‟inconveniente che non esistono funzioni per la sua visualizzazione e
         deve essere pertanto sempre riconvertito in stringa. Scomodo.
         string s = "salve mondo";
         char [] v;
         v=s.ToCharArray();
         s = new String(v);
        utilizzare l’oggetto string builder
         StringBuilder sb = new StringBuilder(s);
         sb[3] = 'x';
         s = sb.ToString();

Sono tutte tecniche valide però bisogna ricordare che una stringa è pur sempre un oggetto . Ad esempio:

                                                                                                                 pag 13
Informatica - Classe Terza                                                                        robertomana.it
                                         Introduzione al linguaggio C#

int main(){
    string s = "salve mondo";
    modifica (s);
    MessageBox.Show(s);
}
void modifica (string s){                          // Viene passato il puntatore !
    s = s.Replace('v', 'x');
}
Dopo il replace il puntatore s punta ad nuova stringa istanziata da replace, ma si tratta del puntatore locale !
Il problema può essere risolto passando la stringa per riferimento (indirizzo del puntatore) modifica(ref s)

Proprietà e Metodi di Istanza
[i] Accede in lettura all‟i-esimo carattere della stringa che viene restituito come Char.
.Length Proprietà contenente il numero di caratteri della stringa.
.Substring(start As Integer, [len As Integer]) Estrae una sottostringa dalla stringa corrente, partendo dalla
        poszione start con lunghezza len. Se len non è specificato estrae fino a fine stringa
.IndexOf(s1 As String [start As Integer], [end As Integer]) Ricerca la sottostringa s1 all‟interno della stringa
        corrente. Restituisce l‟indice della prima corrispondenza. La ricerca può essere compresa tra un indice
        iniziale ed un indice finale. Restituisce –1 se fallisce.
.LastIndexOf(s1 As String [start As Integer], [end As Integer]) Come la precedente, ma restituisce l‟indice
        dell‟ultima occorrenza. Comincia a cercare partendo da start e andando all'indietro. Se start è omesso
        parte dalla fine della stringa. Ad esempio LastIndexOf(“ax” 3) ricerca la sottostringa “ax” partire dalla
        posizione 3 andando a ritroso fino all‟inizio della stringa. Cioè confronta i caratteri 3 e 4 con “ax”. Se
        non fanno match decrementa la posizione e confronta i caratteri 2 e 3 con “ax” e così via.
.IndexOfAny(chr As Char( ), [start As Integer], [end As Integer]) Ricerca uno qualsiasi dei caratteri contenuti nel
        vettore e e restituisce l‟indice della prima ricorrenza oppure –1 se fallisce.
.LastIndexOfAny(chr As Char( ), [start As Integer], [end As Integer]) restituisce l‟indice dell‟ultima occorrenza.
.ToUpper( ) Restituisce la stringa convertita in maiuscolo
.ToLower( ) Restituisce la stringa convertita in minuscolo
.Replace(search As String, replace As String) Sostituisce tutte le ricorrenze della prima sottostringa con la
        seconda. Restituisce l‟intera stringa convertita che deve eventualmente essere rassegnata alla variabile.
.Insert(pos As Integer, s1 As String) Aggiunge la sottostringa s1 davanti al carattere pos della stringa corrente,
        spostando automaticamente verso destra gli altri caratteri
.Remove(start As Integer, len As Integer) Elimina il numero di caratteri specificato partendo dalla posiz indicata.
.Split(vectChr As Char( )) Esegue lo split della stringa in un vettore, secondo uno qualunque dei qualificatori.
.EndsWith(string substr ) if(s.EndsWith(“.txt”)) valido = true;
.StartsWith(s1 As String) As Boolean. Restituisce True se la stringa corrente inizia con la sottostringa indicata in s1
.Trim([vectChar As Char( )]) Se non si specifica nessun parametro, elimina gli spazi iniziali e finali dalla stringa
        corrente. In alternativa è possibile specificare un vettore di caratteri. Trim eliminerà tutti i caratteri iniziali
        e finali contenuti nel vettore. Es Dim cArr( ) As Char = {Cchar(“ “), ControlChars.Tab} s = s.Trim(cArr)
.TrimStart e .TrimEnd analoghi a .Trim ma agiscono solo sui caratteri iniziali / finali.
.PadRight(len As Integer, [chr As Char]) Aggiunge tanti spazi a destra fino ad un numero complessivo di len
        caratteri. E‟ possibile specificare come secondo parametro un carattere diverso dallo spazio.
        Es s = s.PadRight(16, CChar(“0”) Aggiunge tanti zeri fino ad una lunghezza complessiva di 16
.PadLeft(len As Integer, [chr As Char]) Simile alla precedente ma aggiunge a sinistra. La str viene re istanziata.
.Equals(string s2) Restituisce true se la stringa corrente è uguale a s2. Produce lo stesso effetto di ==.
.CompareTo(s2 As String) In C# non è possibile confrontare due stringhe in modo diretto con gli operatori <
e > ma occorre utilizzare questo metodo oppure, meglio ancora, il metodo statico .Compare( )
.CompareTo( ) Confronta la stringa corrente con s2. Restituisce –1 0 +1 a seconda che la stringa corrente sia
minore, =, maggiore di s2. Solo Case Sensitive.
.Clone( ) Restituisce una copia della stringa corrente. Prodceuce lo stesso effetto dell'operatore di assegnazione.

                                                                                                                  pag 14
Informatica - Classe Terza                                                                        robertomana.it
                                        Introduzione al linguaggio C#

Il metodo di istanza .ToString(“N4”) disponibile per qualsiasi tipo di oggetto, converte l‟oggetto in questione in
stringa applicando la formattazione indicata dal parametro. I caratteri di formattazione riconosciuti sono:
   N (Number), D(Intero), C(Currency), E(Scientifico), F(Floating Point), P(Percent), X(Esadecimale)
Dopo N è possibile aggiungere un numero intero che indica il numero di cifre da utilizzare dopo la virgola
Dopo D è possibile aggiungere un intero che indica il numero di cifre complessive di visualizzazione. Se il
numero risulta minore di questa lunghezza, viene completato con un certo numero di zeri all‟inizio della stringa
Dopo F è possibile aggiungere un numero intero che indica il numero di cifre da utilizzare dopo la virgola
Il formato E mostra il numero come nnnnEeee. Dopo E è possibile specificare il numero di cifre della mantissa.
Il formato P converte un numero tra 0 e 1 in una percentuale con 2 cifre fisse dopo la virgola
Il formato X converte un numero intero in stringhe esadecimale. Specificando una lunghezza es :X8 verranno
eventualmente inseriti degli zeri in testa. Sono inoltre consentite maschere personalizzate.
Se la variabile è di tipo data / ora, viene riconosciuta una lunga lista di indicatori riportata nella tabella allegata.

Scansione di un vettore con il ciclo foreach
    foreach (char c in s)                   MessageBox.Show(c.ToString());

Metodi Statici
.Intern (s As String) consente di memorizzare la stringa s all‟interno di una cache che ne velocizza l‟accesso. Es
        s1 = String.Intern(s1)
.IsInterned (s As String) Verifica se la stringa s si trova nella cache (nel qual caso restituisce il puntatore alla
        stringa stessa), oppure no (nel qual caso restituisce Nothing)
.Concat (s1, s2, ….) concatena un numero arbitrario di argomenti String (o Object convertibili in String).
.Compare (s1, s2, [Mode]) Confronta s1 con s2 e restituisce 0 se sono uguali, 1 se s1 > s2, -1 se s1 < s2.
        Mode è un boolean dove False (default) indica case sensitive, True indica invece case unsensitive
.Compare (s1, pos1, s2, pos2, Qta, [Mode]) Versione Overload della precedente. Confronta Qta caratteri di s1, a
        partire dalla posizione pos1, con Qta caratteri di s2, a partire da pos2. Mode è lo stesso di prima.
        I metodi Compare utilizzano le impostazioni della lingua locale, che ne rallenta l‟esecuzione
.CompareOrdinal (s1, s2, [Mode]) Identico a Compare senza però considerare la lingua locale. Più veloce.
.Format Formattazione di una stringa includendo una o più variabili.
msg = String.Format(“Il valore della variabile {0} è {1}”, “x”, x)
Nelle parentesi graffe, dopo l‟indice dell‟argomento, è possibile aggiungere una stringa di formattazione.
Le stringhe di formattazione utilizzabili sono le stesse del metodo toString( )
msg = String.Format(“Il valore della variabile {0} è {1:N4}”, “x”, x)

La classe Statica System.ControlChars
Elenco di costanti predefinite; Cr, Lf, CrLf, Tab, VerticalTab. Back, NullChar, Quote
Classe non supportata in C# dove si continuano ad utilizzare i vecchi caratteri di escape di ANSI C: \n, \r \ t \0

Il cast dei puntatori
A differenza di Visual Basic in C# non esistono le funzione CType e DirectCast, e nemmeno TryCast e TypeOf
ma la conversione di puntatori può essere fatta direttamente mediante il cast inline :
       Object obj = new clsPerson();
       clsPerson p = (clsPerson) obj;

Confronto fra puntatori: L‟operatore IS che verifica se un puntatore sta puntando ad un certo tipo di oggetto
       Object obj = new clsTmp();
       if (obj is clsPerson) {
            clsPerson p = (clsPerson)obj;
       }
                                                                                                                 pag 15
Informatica - Classe Terza                                                                  robertomana.it
                                      Introduzione al linguaggio C#

        foreach (Control ctrl in this.Controls)
           if (ctrl is Button) {
                  Button btn = (Button) ctrl;   btn.Text = "";
           }
Per i numeri si può usare: int n;
                           if (int.TryParse(txt.Text, out n) )   ……………
                           else console.writeln(“Campo non valido”);

Il metodo GetType( ) è invece presente in C#, sia sotto forma di metodo statico della classe Type :
             Type x = Type.GetType("System.Int32");
             MessageBox.Show(x.FullName);
sia come metodo di istanza:
            if (ctrl.GetType().ToString() == "System.Windows.Forms.Button")

                                La classe MessageBox ed il metodo .Show()

MsgBoxResult MessageBox.Show(
      messaggio As String, // Unico parametro obbligatorio
      titolo As String,    // Titolo visualizzato sulla barra blu del titolo.
      pulsanti As MsgBoxButtons, // Pulsanti da visualizzare sulla form
      icon As MsgBoxIcon            // Icona da visualizzare sulla form
      button As MsgBoxDefaultButton
)

MsgBoxButtons indica eventuali pulsanti aggiuntivi che possono essere posizionati all‟interno della finestra del
messaggio. Se non si specifica nulla viene automaticamente posizionato il solo pulsante di OK.
    0     OKOnly               Il solo pulsante OK [default]
    1     OKCancel             Pulsanti OK + Cancel
    2     AbortRetryIgnore     Pulsati Abort + Retry + Ignore
    3     YesNoCancel          Pulsati Si + No + Annulla
    4     YesNo                Pulsati Si + No
    5     vbRetryCancel        Pulsati Riprova + Annulla
MsgBoxIcon
   16     Critical             Cerchio con x interna
   32     Question             Nuvoletta con Punto Interrogativo
   48     Exclamation          Triangolo con Punto Esclamativo
   64     Information          Nuvoletta con i interna
MsgBoxDefaultButton
   0      DefaultButton1       Il primo pulsante è preselezionato
  256     DefaultButton2       Il secondo pulsante è preselezionato
  512     DefaultButton3       Il terzo pulsante è preselezionato

                                                                                                           pag 16
Informatica - Classe Terza                                                                       robertomana.it
                                        Introduzione al linguaggio C#

Il programma rimane bloccato fino a che l‟utente non chiude la finestra clickando su uno dei pulsanti. MsgBox
restituisce come risultato una costante di tipo DialogResult che indica appunto quale pulsante è stato premuto..

DialogResult ris;
ris = MessageBox.Show ("Salvare le modifiche al documento corrente?",
                       "Microsoft Word",
                       MessageBoxButtons.YesNoCancel,
                       MessageBoxIcon.Exclamation );
if (ris == DialogResult.Yes) …………… //Significa che l‟utente ha premuto il pulsante SI

                                              La funzione InputBox
In C# questa funzione non esiste in quanto è definita soltanto all‟interno della libreria Visual Basic.
In caso di necessità si può importare l‟intera libreria Visual Basic aggiungendo il Riferimento al progetto.
using Microsoft.VisualBasic;
string ris = Interaction.InputBox("Inserire un numero");

SINTASSI:
String InputBox(messaggio As String, titolo As String, default As String)

Titolo e Default sono facoltativi.
Messaggio rappresenta il messaggio all‟interno della finestra (es “Prego inserire il vostro Nome”)
Titolo rappresenta il titolo della finestra, cioè ciò che verrà scritto sulla barra blu del titolo.
Default indica un eventuale valore di default che comparirà a video nella casella di Input.
Se la finestra viene chiusa mediante il pulsante Cancel o la x della barra del titolo InputBox restituisce stringa vuota.

                                   Gestione delle eccezioni strutturate
Una eccezione è una condizione inaspettata che si verifica durante l‟esecuzione di una applicazione e che, se non
viene gestita, ne arresta bruscamente l‟esecuzione (tipico Run Time Error).
Una eccezione può essere intercettata dalla procedura nella quale si è verificata. Se ciò non accade, l‟eccezione
viene sollevata al chiamante, che se vorrà potrà gestire l‟eccezione, e così via fino al main. Se nessuno intercetta
l‟eccezione, si verifica un Run Time Error con visualizzazione di un messaggio di errore.

L’oggetto System.Exception
Quando si verifica una eccezione, viene creato un oggetto Exception che, se non gestito, viene passato al
chiamante. Esistono però diversi tipi di oggetti Exception. Ad esempio:
     le operazioni matematiche possono sollevare oggetti Exception del tipo OverflowException o
       DivideByZeroException,
     e funzioni possono sollevare eccezioni del tipo ArgumentOutOfRangeException.
Tutti i vari oggetti Exception dispongono comunque delle seguenti proprietà comuni:
Message    [Read Only] Messaggio di descrizione dell‟errore
Source     Nome dell‟oggetto in cui si è verificato l‟errore.
           Se l‟errore si è verificato nella applicazione corrente, Source sarà stringa vuota
TargetSite Metodo che ha causato l‟errore.
HelpLink URL di una pagina di Help che descrive come recuperare l‟errore. Es: “pagina15.htm#Target2”

                                                                                                                pag 17
Puoi anche leggere