C# Language come


Esempio

La parola chiave as è un operatore simile a un cast . Se un cast non è possibile, l'utilizzo di as produce null che risultare in InvalidCastException .

expression as type è equivalente a expression is type ? (type)expression : (type)null con l'avvertenza che as è valido solo alle conversioni di riferimento, conversioni Null e conversioni boxe. Le conversioni definite dall'utente non sono supportate; al suo posto deve essere usato un cast regolare.

Per l'espansione di cui sopra, il compilatore genera codice tale che l' expression sarà valutata solo una volta e utilizzerà un controllo di tipo dinamico singolo (a differenza dei due nell'esempio sopra riportato).

as può essere utile quando si aspetta un argomento per facilitare diversi tipi. In particolare, concede all'utente più opzioni - piuttosto che controllare ogni possibilità con is prima del casting, o semplicemente lanciare e catturare le eccezioni. È consigliabile utilizzare "come" quando si esegue il casting / controllo di un oggetto che causerà solo una penalità di annullamento. L'utilizzo is di controllare, quindi il cast causerà due penalità di annullamento.

Se un argomento dovrebbe essere un'istanza di un tipo specifico, è preferibile un cast regolare in quanto il suo scopo è più chiaro per il lettore.

Poiché una chiamata a as può produrre null , controllare sempre il risultato di evitare un NullReferenceException .

Esempio di utilizzo

object something = "Hello";
Console.WriteLine(something as string);        //Hello
Console.Writeline(something as Nullable<int>); //null
Console.WriteLine(something as int?);          //null

//This does NOT compile:
//destination type must be a reference type (or a nullable value type)
Console.WriteLine(something as int);

Live Demo su .NET Fiddle

Esempio equivalente senza utilizzo as :

Console.WriteLine(something is string ? (string)something : (string)null);

Ciò è utile quando si esegue l'override della funzione Equals nelle classi personalizzate.

class MyCustomClass
{

    public override bool Equals(object obj)
    {
        MyCustomClass customObject = obj as MyCustomClass;

        // if it is null it may be really null
        // or it may be of a different type
        if (Object.ReferenceEquals(null, customObject))
        {
            // If it is null then it is not equal to this instance.
            return false;
        }

        // Other equality controls specific to class
    }

}