Progettare e usare classi

Completato

Nella programmazione orientata agli oggetti (OOP), le classi sono i blocchi predefiniti di un'applicazione. Comprendere la relazione tra classi e oggetti è essenziale.

  • Le classi sono i progetti usati dagli sviluppatori per definire le proprietà (dati) e i metodi (comportamenti) degli oggetti. Le classi consentono di incapsulare i dati e il comportamento, semplificando l'organizzazione e la gestione del codice.
  • Gli oggetti sono istanze di classi. Quando viene creata un'istanza di una classe, viene creato un oggetto in memoria. Ogni oggetto ha un proprio set di proprietà e metodi, ma condivide la stessa struttura definita dalla classe .

Esaminando gli oggetti reali intorno, è possibile comprendere il funzionamento delle classi e degli oggetti nella programmazione. Gli oggetti nel mondo reale hanno attributi (proprietà) e comportamenti (metodi) che ne definiscono lo scopo e la funzionalità. Ad esempio, un'auto è un oggetto con attributi come make, model e color e comportamenti come guida e arresto.

Oggetti reali

Le persone interagiscono costantemente con gli oggetti nella loro vita quotidiana. Infatti, quasi tutto ciò che interagiamo con può essere considerato come un oggetto.

I criteri seguenti possono essere usati per definire oggetti nel mondo reale:

  • Gli oggetti sono le cose che possiamo vedere e toccare.
  • Gli oggetti hanno uno scopo.
  • Gli oggetti hanno parti che supportano il loro scopo.

Una matita è un esempio di oggetto fisico. Lo scopo di una matita è creare una nota o un disegno. Le parti di una matita includono il corpo, la punta, e forse una gomma. Le parti interagiscono per raggiungere lo scopo previsto della matita.

Esistono anche oggetti fisici come assembly di altri oggetti. L'elenco seguente fornisce esempi di oggetti composti da altri oggetti:

  • Un'auto: lo scopo di un'auto è fornire il trasporto a terra per persone e famiglie. Le parti di un'auto includono un motore, le ruote, un volante e molte altre. Le parti di un'auto lavorano insieme per consentire il trasporto a terra.
  • Una casa: lo scopo di una casa è fornire un rifugio. Le parti di una casa includono una fondazione, pareti esterne, un tetto e camere. Queste parti interagiscono per creare uno spazio vivente.
  • Uno smart phone: lo scopo di uno smart phone è assistere l'utente con attività e attività quotidiane. Le parti di uno smart phone includono uno schermo, un microprocessore, memoria e archiviazione, una batteria, fotocamere e pulsanti. Queste parti interagiscono per abilitare funzionalità di comunicazione, intrattenimento e produttività.

Ogni parte di un'automobile, di una casa o di uno smart phone è un oggetto con il proprio scopo e può anche essere un assemblaggio di oggetti.

Attributi e funzionalità di un oggetto fisico

Prendere un minuto per considerare l'esempio di una matita. Una matita ha parti (corpo, punta, gomma) e uno scopo (creare una nota o un disegno). Le matite condividono queste caratteristiche di base. Tuttavia, non tutte le matite sono uguali.

Alcune matite sono brevi, alcune sono lunghe. Alcune matite sono gialle, alcune sono nere. Alcune matite hanno una punta noiosa, alcuni hanno una punta affilata. Alcune matite hanno una gomma, alcune non hanno una gomma.

Gli attributi di un oggetto sono spesso suddivisi nelle categorie fisiche e comportamentali seguenti:

  • Fisico: gli attributi fisici sono gli aspetti di un oggetto che può essere visto o misurato.
  • Comportamento: gli attributi comportamentali sono gli aspetti di un oggetto che ne descrivono le funzionalità o le interazioni con altri oggetti.

Per l'esempio di matita, gli attributi fisici includono la lunghezza del corpo, il colore del corpo, la nitidezza della punta e se la matita ha o meno una gomma. Gli attributi comportamentali includono la possibilità di scrivere, la possibilità di cancellare e la possibilità di essere affilate. Una matita interagisce con carta o altri oggetti solidi su cui è possibile scrivere o disegnare.

Gli attributi fisici vengono spesso definiti proprietà, mentre gli attributi comportamentali vengono spesso definiti funzioni (metodi nella programmazione C#).

Classi di codice e oggetti nella programmazione C#

Nel mondo della programmazione C# le proprietà e i metodi degli oggetti sono definiti da una classe . Le classi forniscono il progetto per le operazioni che un oggetto (un'istanza della classe) è in grado di eseguire. Il progetto per una classe è denominato definizione di classe.

Quando un'app è in esecuzione, il computer usa una definizione di classe per allocare memoria per un oggetto (un'istanza della classe ). Il computer usa il progetto per configurare un blocco di memoria che rappresenta le dimensioni corrette per l'oggetto. Un oggetto è fondamentalmente un blocco di memoria.

Gli oggetti di codice, proprio come gli oggetti fisici, possono avere valori diversi assegnati alle relative proprietà.

Le classi incapsulano dati e comportamenti

Le classi consentono di incapsulare i dati e il comportamento. L'incapsulamento è il processo di combinazione dei dati e del comportamento in una singola unità. Le classi usano proprietà per abilitare l'accesso ai dati e ai metodi per abilitare i comportamenti.

Proprietà della classe

Le proprietà della classe vengono usate per gestire i dati che differenziano un oggetto (istanza della classe) da un altro oggetto dello stesso tipo.

Le proprietà della classe consentono agli oggetti di leggere, scrivere o calcolare il valore delle variabili (campi dati) definite all'interno della classe . Le proprietà vengono visualizzate come membri dati pubblici, ma vengono implementate come metodi speciali denominati funzioni di accesso . Questa funzionalità consente ai chiamanti di accedere facilmente ai dati e contribuisce comunque a promuovere la sicurezza e la flessibilità dei dati.

I valori delle proprietà possono essere letti usando una funzione di accesso get e assegnate tramite una funzione di accesso set.

Metodi di classe

I metodi di classe definiscono le azioni (comportamenti) che una classe può eseguire.

I metodi possono accettare parametri che forniscono dati di input e possono restituire dati di output tramite parametri. I metodi possono anche restituire un valore direttamente, senza usare un parametro .

Ad esempio, la classe Console include metodi WriteLine, ReadLinee Clear (tra gli altri). Questi metodi consentono di abilitare i comportamenti previsti della classe Console. I metodi possono essere usati per eseguire azioni, ad esempio calcoli, manipolazione dei dati o interazione con altri oggetti.

I metodi sono spesso progettati per accettare uno o più argomenti del metodo. Gli argomenti del metodo vengono passati al metodo come parametri dell'istruzione chiamante utilizzata per richiamare il metodo . Ad esempio, il metodo WriteLine della classe Console può accettare un argomento stringa fornito dall'istruzione chiamante.

Definizioni di classi nel codice C#

L'esempio seguente illustra una classe semplice in C#. La classe Phone ha proprietà per Brand, Modele Year. La classe include anche metodi per Call e Text.


public class Phone
{
    public string? Brand { get; set; }
    public string? Model { get; set; }
    public int Year { get; set; }

    public void Call(string phoneNumber)
    {
        Console.WriteLine($"Calling {phoneNumber}...");
    }

    public void Text(string phoneNumber, string message)
    {
        Console.WriteLine($"Texting {phoneNumber}: {message}");
    }
}

Uso degli spazi dei nomi

Nella programmazione C# gli spazi dei nomi vengono usati in due modi:

  • La libreria di classi .NET usa spazi dei nomi per organizzare le numerose classi.
  • Gli sviluppatori dichiarano i propri spazi dei nomi per controllare l'ambito dei nomi delle classi e dei metodi in progetti di programmazione più grandi.

Spazi dei nomi nella libreria di classi .NET

Gli spazi dei nomi vengono usati dalla libreria di classi .NET per raggruppare i tipi correlati, semplificando la ricerca e l'uso di tali tipi.

Si consideri il frammento di codice seguente:


System.Console.WriteLine("Hello World!");

In questo esempio, System è uno spazio dei nomi e Console è una classe in tale spazio dei nomi.

Specificare il nome completo della classe (System.Console) garantisce che venga usata la classe corretta. Tuttavia, l'uso di nomi completi può essere complesso quando si usano molte classi dello stesso spazio dei nomi. Per migliorare la leggibilità del codice, è possibile usare la direttiva using. La direttiva using consente di usare i tipi definiti in uno spazio dei nomi senza specificare lo spazio dei nomi completo di tale tipo.

Il frammento di codice seguente implementa la direttiva using per migliorare la leggibilità del codice:


using System;

Console.WriteLine("Hello World!");

Nota

A partire da .NET 6, direttive diglobal using implicite vengono aggiunte ai nuovi progetti C#. Ciò significa che è possibile usare i tipi definiti in questi spazi dei nomi senza dover specificare il nome completo o aggiungere manualmente una direttiva using. L'aspetto implicito si riferisce al fatto che le direttive using globali vengono aggiunte a un file generato nella directory obj del progetto. Questa funzionalità consente di usare Console.WriteLine senza dichiarare esplicitamente using System durante lo sviluppo di app nelle versioni 6.0 o successive di .NET.

Organizzazione di classi con spazi dei nomi

La dichiarazione di spazi dei nomi personalizzati consente di controllare l'ambito dei nomi delle classi e dei metodi in progetti di programmazione più grandi. Usare la parola chiave namespace per dichiarare uno spazio dei nomi.

Si consideri il frammento di codice seguente:


namespace SampleNamespace
{
    class SampleClass
    {
        public void SampleMethod()
        {
            System.Console.WriteLine("SampleMethod inside SampleNamespace");
        }
    }
}

Il nome dello spazio dei nomi deve essere un nome di identificatore C# valido.

È possibile dichiarare uno spazio dei nomi per tutti i tipi definiti nel file, come illustrato nel frammento di codice seguente:


namespace SampleNamespace;

class SampleClass
{
    public void SampleMethod()
    {
        System.Console.WriteLine("SampleMethod inside SampleNamespace");
    }
}

class AnotherSampleClass
{
    public void AnotherSampleMethod()
    {
        System.Console.WriteLine("AnotherSampleMethod inside SampleNamespace");
    }
}

Il vantaggio di questa nuova sintassi è che è più semplice, risparmiando spazio orizzontale e parentesi graffe. In questo modo il codice risulta più semplice da leggere.

Panoramica degli spazi dei nomi

Gli spazi dei nomi hanno le proprietà seguenti:

  • Organizzano progetti di codice di grandi dimensioni.
  • Sono delimitati usando l'operatore ..
  • La direttiva using obvia il requisito di specificare il nome dello spazio dei nomi per ogni classe.
  • Lo spazio dei nomi globale è lo spazio dei nomi "radice": global::System fa sempre riferimento allo spazio dei nomi .NET System.

L'uso di spazi dei nomi per raggruppare i tipi correlati semplifica la ricerca e l'uso di tali tipi.