C#Programmazione

Le classi

Una struttura dati che definisce e mantiene lo stato e il comportamento in una singola unità. La creazione avviene mediante l’utilizzo della parola chiave class:

class Auto { … }

Se non specifichiamo niente la classe sarà visibile solo all’interno dell’assembly che la contiene, in questo caso il modificatore implicito è internal. L’opposto public consente la visibilità da parte di altri assembly.
Una classe può contenere:

  • membri dati – campi e costanti;
  • membri funzione – metodi, proprietà, eventi, indicizzatori, operatori, costruttori o distruttori;

Per poter accedere ai membri di una classe si utilizza l’operatore punto:

int len = Console.Title.Lenght;

Campi e costanti
I campi sono variabili che appartengono a una classe e il suo ambito si estende al solo corpo della classe in cui vengono definiti, questo significa che implicitamente sono definiti come private. Per utilizzarli all’esterno dobbiamo definirli public, ma in questo caso non viene rispettata la regola dell’incapsulamanto.
Una costante è un campo il cui valore è predeterminato a tempo di compilazione. Le stringhe interpolate possono essere create anche per mezzo di costanti

const string Potenza = “55kW”;
const string Modello = $”Fiesta {Potenza}”;
const string Marca = $”Ford {Modello}”;

Se la costante viene inizializzata in fase di esecuzione dobbiamo usare il modificatore readonly.

Metodi
Permettono di definire il comportamento di un oggetto, può ricevere dati in ingresso e restituire dati di output.

public class Auto
{
   public void Consumo(int Chilometri) { … }
}

I metodi possono accedere agli altri membri della classe, per poter chiamare il metodo all’esterno della classe dovremmo specificare anche il nome dell’istanza


Auto auto = new Auto();
auto.Consumo(284);

Si parla di overloading quando abbiamo più metodi con lo stesso nome ma con i parametri differenti per numero o tipo.

I parametri passati al metodo vengono passati per valore, possiamo decidere di passarli per riferimento anteponendo il modificatore ref. Se il parametro è un tipo di riferimento tutte le modifiche fatte all’interno del metodo si rifletteranno sull’oggetto che è stato utilizzato come parametro anche all’uscita dal metodo stesso.

Membri statici
Possiamo istanziare due oggetti Auto e ognuno ha dei valori diversi:

Auto autoUno = new Auto(“Ford”, “Fiesta”);
Auto autoDue = new Auto(“Fiat”, “Panda”);

Possiamo avere la necessità di condividere alcuni membri fra tutte le istanze, in questo caso i membri devono avere la definizione static.

class Auto
{
   public static int numAuto;   public Auto(string Marca, string Modello)
   {
      …
      numAuto++;
      …
   }
}

Il contatore delle auto viene incrementato ogni volta che viene istanzata, possiamo accedere al valore di questa variabile indicando anche il nome della classe:

Console.WriteLine(Auto.numAuto);

Le proprietà
Permettono di implementare il meccanismo di incapsulamento, controllando le modalità di accesso ai campi privati di una classe tramite get (accesso in lettura) e set (accesso in scrittura, la parola chiave value contiene il valore assegnato alla proprietà).

Tipi nidificati
Una classe o struct definita all’interno di un’altra classe o struct è detta tipo nidificato, consente di realizzare un incapsulamento controllando il livello di visibità.

Inizializzatori di oggetti
La creazione di una istanza avviene tramite l’operatore new, possiamo passare i campi e le proprietà che vogliamo inizializzare e successivamente possiamo passare i paramentri

class Auto
{
   public string Marca { get; set; }
   public string Modello { get; set; }
   private string Versione;   public Auto() : this(“base”);
   { }   public Auto(string versione)
   {
      Versione = versione;
   }// la versione sarà base
Auto autoFiesta = new Auto { Marca = “Ford”, Modello = “fiesta” };// la versione sarà quella indicata
Auto autoEscort = new Auto(“ghia”) { Marca = “Ford”, Modello = “escort” };

Indicizzatori
Consentono di accedere agli oggetti come fossero array, nella proprietà this dobbiamo specificare il tipo di ritorno e il parametro da utilizzare come indice.

class TelephoneNumber
{
   public string Nome { get; set; }
   public int Number { get; set; }
}class Smartphone
{
   private TelephoneNumber[] numeriTelefonici;
   public TelephoneNumber this[string nome]
   {
      get
      {
         foreach (TelephoneNumber number in numeriTelefonici)
         {
            if (number.Nome == nome) return number;
         }
         return null;
      }
   }
}

Struct

A differenza delle classi che sono tipi riferimento la struttura è un tipo valore. Le struct possono avere dei costruttori personalizzati con parametri. Una struttura può essere passata per riferimento utilizzando il modificatore ref.

struct Point
{
   public string Name { get; set; }
   public double X = 0;
   public double Y = 0;   public Point(double x, double y)
   {
      this.X = x;
      this.Y = y;
   }
}