System.Console.WriteLine() //stampa a video il messaggio System.Console.ReadLine() //fa sì che l'applicazione aspetti che l'utente prema il tasto INVIO prima di terminare.
Dichiarazione di una classe
public class Persona { string mNome; string mCognome; //Altre variabili... public Persona(string Nome, string Cognome) { //Imposta le proprietà iniziali della classe. mNome = Nome; mCognome = Cognome; } public void StampaMessaggio() { } private void Appoggio() { } } //Crea un oggetto p che è istanza della classe Persona Persona p = new Persona("Marco", "Minerva");
Setter e getter di un campo
Si fa così
public string Nome { get { return mNome; } set { if (value == string.Empty) mNome = "(Nessun nome)"; else mNome = value; } } //Si utilizzano così Console.WriteLine(p.Nome); p.Nome = "Pippo";
Namespace
Più classi possono essere raggruppate in un unico namespace. Ad esempio:
namespace Prova { public class Classe1 { } public class Classe2 { } } //Con questo costrutto, per dichiarare, ad esempio, un oggetto di tipo Classe1 è necessario scrivere: Prova.Classe1 c1 = new Prova.Classe1();
Si possono definire namespace annidati, ad esempio:
namespace N1 { namespace N2 { public class Classe1 { } public class Classe2 { } } } N1.N2.Classe1 c1 = new N1.N2.Classe1(); N1.N2.Classe2 c2 = new N1.N2.Classe2();
Per non dover indicare ogni volta i namespace in cui si trovano le classi che si stanno utilizzando, è possibile utilizzare la parola chiave using
using System; public class HelloWorld { public static void Main() { Console.WriteLine("Ciao Mondo!"); Console.ReadLine(); } }
Tipi di dato
I tipi sono come quelli di java
//Il tipo struct permette di definire nuovi tipi di dati a partire da quelli esistenti: public struct Persona { public string Nome; public string Cognome; }
ogni membro deve avere un modificatore di accesso (public, private, ecc.).
Ecco un esempio che utlizza una struct come una classe, ne definisce anche il costruttore
public class HelloWorld { public struct Persona { public string Nome; public string Cognome; public Persona(string Nome, string Cognome) { this.Nome = Nome; this.Cognome = Cognome; } public string NomeCompleto { get { return Nome + " " + Cognome; } } } public static void Main() { Persona p = new Persona("Marco", "Minerva"); System.Console.WriteLine("Ciao " + p.NomeCompleto + "!"); System.Console.ReadLine(); } }
La differenza tra struct e class sta nel fatto che "Il tipo struct è adatto alla rappresentazione di oggetti leggeri […] Se ad esempio si dichiara una matrice di 1.000 oggetti [classi] Point, si allocherà ulteriore memoria per i riferimenti a ciascun oggetto. In questo caso la struttura risulta meno onerosa". Inoltre una struct può implementare interfacce ma non può ereditare.
Le enum consentono di associare nomi simbolici a costanti numeriche.
public enum Stati : byte { Italia, America, Francia, Inghilterra //,... } Stati s = Stati.America; System.Console.WriteLine("Stato selezionato: " + s.ToString());
Passaggio di parametri
- in: passaggio per valore
- ref e out: passaggio per riferimento. ref richiede che si inizializzi la variabile prima della chiamata del metodo, mentre con out è sufficiente dichiarare la variabile e passarla senza inizializzazione. In pratica con out è possibile inizializzare intere strutture dati dall'interno di un metodo.
// Se non specificato diversamente, il parametro è di tipo «in» public void Calcola(int N){ N = 10; } public void CalcolaOut(out int N){ N = 10; } public void CalcolaRef(ref int N){ N += 1; } Un possibile utilizzo di questi metodi è il seguente: int i = 7; Calcola(i); //All'uscita, i vale ancora 7 int i = 7; CalcolaRef(ref i); //All'uscita, i vale i + 1 = 8 // i è solo dichiarata non inizializzata int i; // la passiamo con «out» CalcolaOut(out i); //All'uscita, i vale 10
Ereditarietà
public class Studente : Persona { private int mMatricola; public Studente(string Nome, string Cognome, int Matricola) : base(Nome, Cognome) { mMatricola = Matricola;
base usato in questo contesto richiama il costruttore della superclasse