Condividi tramite


Creare tipi in C#

Questa esercitazione illustra la creazione di tipi in C#. Si scrivono piccole quantità di codice, quindi si compila ed esegue tale codice. L'esercitazione contiene una serie di lezioni che esplorano diverse categorie di tipi in C#. Queste lezioni illustrano i concetti fondamentali del linguaggio C#.

Suggerimento

Quando un blocco di frammenti di codice include il pulsante "Esegui", il pulsante apre la finestra interattiva o sostituisce il codice esistente nella finestra interattiva. Quando il frammento di codice non include un pulsante "Esegui", è possibile copiare il codice e aggiungerlo alla finestra interattiva corrente.

Le esercitazioni precedenti hanno funzionato con testo e numeri. Stringhe e numeri sono tipi semplici: ognuno archivia un singolo valore. Man mano che i programmi aumentano, è necessario lavorare con strutture di dati più sofisticate. C# offre diversi tipi di tipi che è possibile definire quando sono necessarie strutture di dati con più campi, proprietà o comportamento. Iniziamo a esplorare questi tipi.

Tuple

Le tuple sono una sequenza ordinata di valori con lunghezza fissa. Ogni elemento di una tupla ha un tipo e un nome facoltativo. Il codice seguente dichiara una tupla che rappresenta un punto 2D. Selezionare il pulsante "Esegui" per incollare il codice seguente nella finestra interattiva ed eseguirlo.

var pt = (X: 1, Y: 2);

var slope = (double)pt.Y / (double)pt.X;
Console.WriteLine($"A line from the origin to the point {pt} has a slope of {slope}.");

Suggerimento

Durante l'esplorazione di C# (o qualsiasi linguaggio di programmazione), si commettono errori durante la scrittura di codice. Il compilatore trova tali errori e li segnala all'utente. Quando l'output contiene messaggi di errore, esaminare attentamente il codice di esempio e il codice nella finestra interattiva per vedere cosa correggere. Questo esercizio consente di apprendere la struttura del codice C#.

È possibile riassegnare qualsiasi membro di una tupla. Aggiungere il codice seguente nella finestra interattiva dopo il codice esistente. Premere di nuovo "Esegui" per visualizzare i risultati.

pt.X = pt.X + 5;
Console.WriteLine($"The point is now at {pt}.");

È anche possibile creare una nuova tupla che è una copia modificata dell'originale usando un'espressione with . Aggiungere il codice seguente dopo il codice già presente nella finestra interattiva e premere "Esegui" per visualizzare i risultati:

var pt2 = pt with { Y = 10 };
Console.WriteLine($"The point 'pt2' is at {pt2}.");

La tupla pt2 contiene il X valore di pt (6) e pt2.Y è 10.

Le tuple sono tipi strutturali. In altre parole, i tipi di tupla non hanno nomi come string o int. Un tipo di tupla è definito dal numero di membri, riferito come arità, e dai tipi di questi membri. I nomi dei membri sono per comodità. È possibile assegnare una tupla a un'altra tupla con la stessa arità e gli stessi tipi anche se i membri hanno nomi diversi. È possibile aggiungere il codice seguente dopo il codice già scritto nella finestra interattiva e provarlo:

var subscript = (A: 0, B: 0);
subscript = pt;
Console.WriteLine(subscript);

La variabile subscript ha due membri, entrambi numeri interi. Sia subscript che pt rappresentano istanze dello stesso tipo di tupla: una tupla contenente 2 int membri.

Le tuple sono facili da creare: si dichiarano più membri racchiusi tra parentesi. Le seguenti dichiarano tuple diverse di diverse arità e tipi di membri. Aggiungere il codice seguente per creare nuovi tipi di tupla:

var namedData = (Name: "Morning observation", Temp: 17, Wind: 4);
var person = (FirstName: "", LastName: "");
var order = (Product: "guitar picks", style: "triangle", quantity: 500, UnitPrice: 0.10m);

Le tuple sono facili da creare, ma sono limitate nelle loro funzionalità. I tipi di tupla non hanno nomi, quindi non è possibile trasmettere significato all'insieme di valori. I tipi di tupla non possono incorporare comportamenti. C# include altri tipi di tipi che è possibile creare quando il tipo definisce il comportamento.

Creare tipi di record

Le tuple sono ideali per quei momenti in cui si desiderano più valori nella stessa struttura. Sono leggeri e possono essere dichiarati come vengono usati. Con il procedere del programma, potresti notare che utilizzi lo stesso tipo di tupla in tutto il codice. Se l'app funziona nello spazio grafo 2D, le tuple che rappresentano i punti potrebbero essere comuni. Una volta individuato, è possibile dichiarare un record tipo che archivia tali valori e offre altre funzionalità. Nell'esempio di codice seguente viene usato un Main metodo per rappresentare il punto di ingresso per il programma. In questo modo, è possibile dichiarare un record tipo che precede il punto di ingresso nel codice. Premere il pulsante "Esegui" nel codice seguente per sostituire l'esempio esistente con il codice seguente.

Avvertimento

Non copiare e incollare. Per eseguire l'esempio seguente, è necessario reimpostare la finestra interattiva. Se si commette un errore, la finestra si blocca ed è necessario aggiornare la pagina per continuare.

Il codice seguente dichiara e usa un record tipo per rappresentare un Pointoggetto e quindi usa tale Point struttura nel Main metodo :

public record Point(int X, int Y);

public static void Main()
{
    Point pt = new Point(1, 1);
    var pt2 = pt with { Y = 10 };
    Console.WriteLine($"The two points are {pt} and {pt2}");
}

La record dichiarazione è una singola riga di codice per il Point tipo che archivia i valori X e Y nelle proprietà di sola lettura. Usi il nome Point ovunque si usa quel tipo. I tipi denominati correttamente, ad esempio Point, forniscono informazioni sulla modalità di utilizzo del tipo. Il Main metodo mostra come usare un'espressione with per creare un nuovo punto che rappresenta una copia modificata del punto esistente. La riga pt2 = pt with { Y = 10 } indica che "pt2 ha gli stessi valori, pt ad eccezione del fatto che Y viene assegnato a 10". È possibile aggiungere un numero qualsiasi di proprietà da modificare in una singola with espressione.

La dichiarazione precedente record è una singola riga di codice che termina in ;, come tutte le istruzioni C#. È possibile aggiungere comportamento a un tipo record dichiarando membri. Un membro di un record può essere una funzione o più elementi dati. I membri di un tipo si trovano nella dichiarazione di tipo, tra { e } caratteri. Sostituire la dichiarazione di record creata con il codice seguente:

public record Point(int X, int Y)
{
    public double Slope() => (double)Y / (double)X;
}

Aggiungere quindi il codice seguente al Main metodo dopo la riga contenente l'espressione with :

double slope = pt.Slope();
Console.WriteLine($"The slope of {pt} is {slope}");

Hai aggiunto formalità alla tupla che rappresenta un valore X e Y. Hai creato un record che ha definito un tipo nominato e incluso un metodo per il calcolo della pendenza. Un tipo record è una sintassi abbreviata per un tipo record class: un tipo class che include un comportamento aggiuntivo. È possibile modificare il tipo di Point per renderlo un record struct.

public record struct Point(int X, int Y)
{
    public double Slope() => (double) Y / (double) X;
}

record struct è un tipo di struct che include il comportamento extra aggiunto a tutti record tipi.

Tipi struct, classe e interfaccia

Tutti i tipi denominati in C# sono class o struct tipi. Un class è un tipo di riferimento. Un struct è un tipo di valore. Le variabili di un tipo valore archiviano il contenuto dell'istanza inline in memoria. In altre parole, un archivia record struct Point due numeri interi: X e Y. Le variabili di un tipo di riferimento archiviano un riferimento o un puntatore alla risorsa di archiviazione per l'istanza. In altre parole, un record class Point oggetto archivia un riferimento a un blocco di memoria che contiene i valori per X e Y.

In pratica, ciò significa che i tipi valore vengono copiati quando assegnati, ma una copia di un'istanza di classe è una copia del riferimento. Il riferimento copiato si riferisce alla stessa istanza di un punto, con lo stesso spazio di archiviazione per X e Y.

Il record modificatore indica al compilatore di scrivere vari membri per te. Per altre informazioni, vedere l'articolo sui tipi di record nella sezione Nozioni fondamentali.

Quando si dichiara un record tipo, si dichiara che il tipo deve usare un set predefinito di comportamenti per confronti di uguaglianza, assegnazione e copia di istanze di tale tipo. I record nel database sono la scelta migliore quando la tua responsabilità principale è archiviare dati correlati. Man mano che si aggiungono altri comportamenti, è consigliabile usare struct o class senza il record modificatore.

I tipi vengono usati struct per i tipi valore quando è necessario un comportamento più sofisticato, ma la responsabilità principale consiste nell'archiviare i valori. Si usano class tipi per usare idiomi orientati agli oggetti come incapsulamento, ereditarietà e polimorfismo.

È anche possibile definire interface i tipi per dichiarare contratti comportamentali che devono essere implementati da tipi diversi. Entrambi i struct tipi e class possono implementare interfacce.

In genere si usano tutti questi tipi in programmi e librerie di grandi dimensioni. Dopo aver installato .NET SDK, è possibile esplorare questi tipi usando le esercitazioni sulle classi nella sezione Nozioni fondamentali.

È stata completata l'esercitazione interattiva "Creare tipi in C#". È possibile selezionare il collegamento Rami e cicli per avviare l'esercitazione interattiva successiva oppure visitare il sito .NET per scaricare .NET SDK, creare un progetto nel computer e continuare a scrivere codice. La sezione "Passaggi successivi" ti riporta indietro a questi tutorial.

Per altre informazioni sui tipi in C#, vedere gli articoli seguenti: