Linguaggi di programmazione

Type safety (strong typing)

In linguaggio C#

Ecco un semplice esempio di codice C#, utile a mostrare come vengono gestiti i tipi in un linguaggio fortemente tipizzato.

Come nel precedente articolo su JavaScript, definiamo una funzione per la somma di due numeri interi:

private int add(int a, int b) => a + b;

Poi utilizziamola per il suo scopo:

int result = add(12, 25);
Console.WriteLine($"Sum = {result}");

Otteniamo:

Sum = 37

Fin qui tutto bene, ma ora proviamo a utilizzarla in modo più creativo, come in precedenza con JavaScript:

int result = add([1, 2, 3], "abracadabra");
Console.WriteLine($"Sum = {result}");

Appena scriviamo il codice, viene segnalato un doppio errore:

Argument 1: cannot initialize 'int' with a collection expression
Argument 2: cannot convert from 'string' to 'int'

Non possiamo compilare né eseguire il codice.

Ora supponiamo di avere una funzione GetValueFromUser() che ci restituisce una stringa contenente un valore fornito dall'utente. Nell'esempio seguente la usiamo la utilizziamo due volte, per ottenere due numeri da sommare. Per conciliare i tipi, dobbiamo esplicitamente convertire i due valori in numeri interi:

string x = GetValueFromUser();
string y = GetValueFromUser();
int a = int.Parse(x);
int b = int.Parse(y);
int result = add(a, b);
Console.WriteLine($"Sum = {result}");

Il problema, ora, è che nel caso le stringhe x e y non siano rappresentazioni valide di numeri interi, possiamo avere un errore run-time, sotto forma di eccezione. Dobbiamo quantomeno gestirla:

string x = GetValueFromUser();
string y = GetValueFromUser();
try
{
    int a = int.Parse(x);
    int b = int.Parse(y);
    int result = add(a, b);
    Console.WriteLine($"Sum = {result}");
}
catch (FormatException ex)
{
    Console.WriteLine($"Conversion error: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"Unexpected error: {ex.Message}");
}

O in alternativa, usare una funzione di parsing diversa:

string x = GetValueFromUser();
string y = GetValueFromUser();
if (int.TryParse(x, out int a) && int.TryParse(y, out int b))
{
    int result = add(a, b);
    Console.WriteLine($"Sum = {result}");
}
else
    Console.WriteLine($"Conversion error");


In linguaggio Dart

Segue un esempio analogo, in Dart; dapprima definiamo la funzione che calcola la somma:

int add(int a, int b) => a + b;

Poi utilizziamola; si noti che la funzione tryParse, diversamente dalla sua analoga C#, restituisce un intero nullabile, forse rendendo il codice più leggibile, ma in ogni caso ottenendo il medesimo risultato:

String x = getValueFromUser();
String y = getValueFromUser();
int? a = int.tryParse(x);
int? b = int.tryParse(y);
if (a != null && b != null) {
  int result = add(a, b);
  print('Sum = $result');
} else {
  print("Conversion error.");
}

Per una descrizione dei tipi nullabili, si veda l'articolo sulla null safety.


Giorgio Barchiesi
Albo degli Ingegneri Sez. A, N. 4027 della Prov. di Trento
P.IVA 02370260222, C.F. BRC GRG 58L26 C794R

Copyright © 2015-2024 Giorgio Barchiesi - Tutti i diritti riservati