Casting in [C#]: implicit, explicit e utilizzo delle keyword as e is

In C#, ma in genere in tutti i linguaggi di programmazione che lo permettono, il casting è un operazione che consente di convertire un valore di un determinato tipo in un altro tipo di dati in modo che possa essere utilizzato in un calcolo o metodo o in qualsiasi altra situazione in cui il tipo di dati corrente del valore non è adatto.

Conversioni Implicite ed esplicite

La conversione dei tipi di dati forniti dal casting può essere implicita o esplicita. Un cast implicito si verifica automaticamente quando è stato definito un operatore di conversione implicito e i due tipi di dati sono compatibili.

Un cast esplicito viene utilizzato quando i due tipi di dati non sono completamente compatibili e richiede il prefisso del tipo di origine con un operatore di cast. Questo operatore è il tipo di dati desiderato racchiuso tra parentesi ().

L’esempio seguente mostra  le conversioni utilizzando cast impliciti ed espliciti per tipi di dati numerici di base.

Nota il requisito per l’operatore di cast per la seconda conversione.

uint integer = 100;
long longInteger;
 
// Implicit cast
longInteger = integer;
 
// Explicit cast
integer = (uint)longInteger;

Con le classiche conversioni viste fin ora se il cast fallisce, viene generata un’eccezione che può essere gestita o meno a secondo delle esigenze.

Utilizzo della keyword as

In c# è comunque possibile gestire la conversione di tipi con la keyword as.

Utilizzando la keyword as se la conversione di tipo non va a buon fine, viene restituito un null, che può essere verificato ed evitare che venga generata un’eccezione. E’ evidente che questa metodologia può essere utiliizata solo con  i tipi a cui è possibile assegnare un valore null.

Il concetto di tipo di dato nullable è stato introdotto a partire da .NET 2.0. Poiché a questi tipi è possibile assegnare un valore nullo, sono validi per l’uso con la keyword as.

// Esempio di conversione explicit  generica
private void button1_Click(object sender, EventArgs e)
{
    Button button = (Button)sender; // explicit cast here
    button.Text = "Processing...";
}

In questo esempio se la variabile sender non è di tipo Button il sistema non sa come gestirla e viene generata una eccezione InvalidCastException.

// Conversione usanto as
private void button1_Click(object sender, EventArgs e)
{
    Button button = sender as Button;

    if (button != null)
    {
        button.Text = "Processing...";
    }
    else
    {
        //Do what you need to do here
    }
}

In questo caso si dice al compilatore di considerare la variabile sender come un Button e di assegnarla alla variabile button.

Tuttavia in questo caso se sender è di un tipo non compatibile con button, l’assegnazione a button verrà assegnato il valore null.

Utilizzo della keyword is

Un altro modo per evitare problemi di casting è l’utilizzo della keyword is.

Questa parola chiave permette di stabilire il tipo di dato con cui si ha a che fare prima di utilizzarlo prevenendo quindi eventuali problematiche.

Rimanendo nello stesso esempio

private void button1_Click(object sender, EventArgs e)
{
    if (sender is Button)
    {
        Button button = (Button)sender;
        button.Text = "Processing...";
    }
    else
    {
        //Do what you need to do here
    }
}

Prima di assegnare ed utilizzare la variabile sender verifichiamo se è o meno di tipo Button. In questo modo siamo certi che l’assegnazione non genererà alcun problema.

Riferimenti :

http://www.blackwasp.co.uk/CSharpConversionOverload.aspx

https://stackoverflow.com/questions/4926677/c-sharp-as-cast-vs-classic-cast

https://coderwall.com/p/18dgtg/using-as-and-is-for-safe-casting-in-c

https://www.dotnetperls.com/as

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *