CLR consente di eseguire il cast di un oggetto sul tipo o su qualsiasi tipo di base. Un cast per il tipo di base è già considerato sicuro ed è implicito.
per es.
Oggetto s = new String();
Ma il CLR vuole di specificare cast esplicito in fase di lancio per un tipo derivato
String str = s; // Give error and needs you to explicitly cast it
//To get it to work
String str = (String)s;
Ora qui quello che succede s non viene convertito in stringa, ma controllato se è di tipo String o meno. Se si trova che sia di tipo String, il cast è successo altrimenti viene generata una InvalidCastExcetion. più
due modi per caso stanno usando è e come operatori
è operatore: Questo restituisce true se il cast riesce altrimenti falso.
ad es.
Object o = new Object();
Boolean b1 = (o is Object); // b1 is true
Boolean b2 = (o is DateTime); // b2 is false
Quindi, prima di chiamare qualsiasi metodo, di solito si scrive codice come questo
if(o is DateTime) // Check this by observing the object
{
DateTime d = (DateTime)o; // Again cast the object to obtain a reference
// Perform operations
}
Questo è un po 'costoso, perché CLR getta due volte.
Per evitare questo, abbiamo l'operatore come.
come operatore: restituisce il riferimento al tipo di oggetto selezionato, altrimenti restituisce null.
ad es.:
DateTime d = o as DateTime; // Check the object to verify the case and returns reference to the object itself or null
if(d != null)
{
// Perform the operations
}
Quindi, è possibile notare un lieve aumento delle prestazioni quando si utilizza come operatore.
Questo è tutto ciò che il CLR ha da offrire quando si tratta di tipi di casting.
Quando si tratta di codice:
oggetto str = "abc";
str.ToString() chiamerà il metodo ToString della classe System.object che è un metodo virtuale. Quando si chiama un metodo virtuale, CLR controlla effettivamente il tipo di oggetto indicato dal chiamante.
Qui str sta effettivamente puntando a un oggetto stringa. Quindi il compilatore genererà il codice per chiamare il metodo ToString della classe String che stamperà "abc" come output. Questo concetto è il polimorfismo in cui quando si chiama un metodo virtuale di qualsiasi tipo, il tipo di oggetto effettivo viene prima ottenuto dal CLR e quindi il metodo appropiato viene chiamato sul tipo corretto dell'oggetto come tipo String nel caso.
Hai dato un'occhiata all'IL prodotto per un cast del genere? – Oded
Immagino che un cast sia strettamente 'stringa myStr = myObj come stringa;' Forse la risposta può includere le differenze (per quanto riguarda CLR ...) – EtherDragon
@EtherDragon - 'as' è più di un" try cast ". La sintassi dell'OP è sicuramente un cast. – Oded