2009-12-06 21 views
13

qual è la differenza, così come i pro ei contro traoggetto Casting in C#

LinkButton lb = (LinkButton)ctl; 

e

LinkButton lb = ctl as LinkButton; 

Ho provato ad utilizzare il primo e mi dà errore, poi ho provato l'altro con la parola chiave come, funziona bene.

Grazie in anticipo.

+0

Ho visto questo. Deve essere duplicato. :) –

+0

possibile duplicato di [Direct casting vs 'as' operator?] (Http://stackoverflow.com/questions/132445/direct-casting-vs-as-operator) –

risposta

15

Il primo è un cast esplicito e il secondo è una conversione. Se la conversione non riesce per la parola chiave as, restituirà semplicemente null invece di generare un'eccezione.

Questa è la documentazione per ogni:

nota nella documentazione linkato sopra, essi affermano la parola chiave as non supporta le conversioni definite dall'utente. +1 a Zxpro :) Questo è quanto una conversione definita dall'utente è:

User-Defined Conversions Tutorial

+2

Credo sia anche molto importante ricordare che il L'operatore 'as' non esegue alcuna conversione definita dall'utente (implicita o esplicita). –

5

ritengo che colata utilizzando il primo metodo genera un'eccezione se non può lanciare l'oggetto correttamente (cercando di lanciare il tipo errato), mentre l'utilizzo della parola chiave as imposterà semplicemente la variabile su null se non è in grado di eseguirla correttamente.

Quindi assicuratevi che se si utilizza la parola chiave as cast, si controlla

if(lb == null) 
    return null; // or throw new Exception() 

e se si utilizza l') cast (si circondano con

try 
{ 
    LinkButton lb = (LinkButton)ctl; 
} 
catch(InvalidCastException ex) 
{ 
    //TODO: Handle Exception 
} 
+1

haha, Crow T Robot, adoro il nome. – AaronLS

1

Il secondo si chiama cast sicuro, che, invece di lanciare un'eccezione, metterà "nulla" alla tua variabile. In modo che non funzionano bene, ma imposta il LinkButton lb NULL

7

mio solito la guida all'uso dell'operatore as contro un cast diretto sono i seguenti:

  1. Se il cast deve avere successo (vale a dire sarebbe un errore continuare se il cast non è riuscito), utilizzare un cast diretto.
  2. Se il cast potrebbe non riuscire e ci deve essere il rilevamento programmatico di questo, utilizzare l'operatore as.

Quanto sopra è vero per i tipi di riferimento. Per i tipi di valore (come bool o int), as non funziona.In tal caso, è necessario utilizzare un controllo is di fare un "getto sicuro", in questo modo:

int y; 
if (x is int) 
{ 
    y = (int)x; 
} 
else 
{ 
    // ... 
} 

Non consiglio cercando di catturare InvalidCastException, in quanto questo è generalmente il segno di un errore di programmazione. Utilizza invece la guida sopra.