Differenza tra is e as keyword


121

Indica qual è la differenza tra ise asparola chiave in C #



3
Se sei interessato a questo argomento, probabilmente vorrai anche sapere qual è la differenza tra gli operatori "as" e "cast": blogs.msdn.com/b/ericlippert/archive/2009/10/08/…
Eric Lippert

7
Vorresti contrassegnare la risposta come accettata? Aiuterebbe gli altri a cercare una risposta simile.
KMån,

Risposte:


151

è

L' isoperatore verifica se è possibile eseguire il cast di un oggetto su un tipo specifico.

Esempio:

if (someObject is StringBuilder) ...

come

L' asoperatore tenta di eseguire il cast di un oggetto su un tipo specifico e restituisce null se non riesce.

Esempio:

StringBuilder b = someObject as StringBuilder;
if (b != null) ...

Anche correlato:

getto

L' operatore cast tenta di eseguire il cast di un oggetto su un tipo specifico e genera un'eccezione se non riesce.

Esempio:

StringBuilder b = (StringBuilder)someObject.

4
Questo non è corretto. isnon controlla se un oggetto può essere lanciato su un tipo specifico. Un numero intero restituisce una multa lunga ma 10 is longè falso.
Martin Smith

9
@ MartinSmith: Stai mescolando la conversione del tipo con il casting. Un intero può essere convertito in long, ma non può essere convertito in long perché non è un long.
Guffa

2
Mi stai dicendo che un intero non può essere castato a lungo? Che (long)some_integerfallirà? Sono abbastanza sicuro che entrambi sappiamo che non è vero senza nemmeno eseguirlo, quindi per favore spiega cosa intendi.
Martin Smith,

12
@MartinSmith: Stai ancora confondendo il casting con la conversione. Non stai convertendo un intero in un long, stai convertendo un intero in un long. Sebbene utilizzino la stessa sintassi, viene eseguito il cast dei riferimenti e convertiti i valori.
Guffa

2
Nota suis : " Tieni presente che l' operatore is considera solo le conversioni di riferimento, le conversioni di boxing e le conversioni di unboxing. Altre conversioni, come le conversioni definite dall'utente, non sono considerate. " (Msdn.microsoft.com/en-us/library/scekt9xw aspx). Informazionias : " Tieni presente che l' operatore as esegue solo conversioni di riferimento, conversioni nullable e conversioni boxing. L'operatore as non può eseguire altre conversioni, come le conversioni definite dall'utente, che dovrebbero invece essere eseguite utilizzando espressioni cast. " ( Msdn .microsoft.com / en-us / library / cscsdfbt.aspx )
user1234567

33

La differenza tra IS e As è che ..

IS - Is Operator viene utilizzato per verificare la compatibilità di un oggetto con un determinato tipo e restituisce il risultato come booleano (vero o falso).

AS - L'operatore As viene utilizzato per il cast di oggetti in un determinato tipo o classe.

Ex.

Student s = obj as Student;

è equivalente a:

Student s = obj is Student ? (Student)obj : (Student)null;

1
L'equivalenza mostra chiaramente quale dei due è più primitivo e sottende elegantemente la loro relazione! Grazie per l'equivalenza!
Musa Al-hassy

1
@ MusaAl-hassy In realtà questo non mostra quale sia più primitivo. ispuò essere espresso con ase aspuò essere espresso con is. Ecco come creare un iscon la asparola chiave. Bool b = obj is Student; è equivalente a: Bool b = (obj as Student) != null; Maggiori informazioni su questo qui
Alex Telon

8

Sia ise asparole chiave vengono utilizzate per il tipo di getto in C #.

Quando dai un'occhiata al codice IL di utilizzo di entrambe le parole chiave, otterrai facilmente la differenza.

Codice C #:

BaseClass baseclassInstance = new DerivedClass();
DerivedClass derivedclassInstance;

if (baseclassInstance is DerivedClass)
{
   derivedclassInstance = (DerivedClass)baseclassInstance;
   // do something on derivedclassInstance
}


derivedclassInstance = baseclassInstance as DerivedClass;

if (derivedclassInstance != null)
{
   // do something on derivedclassInstance
}

Codice IL (per il codice C # sopra è nell'immagine allegata):

Codice IL per il codice C # precedente Il codice IL per l' isutilizzo delle parole chiave contiene istruzioni IL sia isinstae castclass.
Ma il codice IL per l' asutilizzo delle parole chiave ha solo isinsta.

Nell'uso sopra menzionato, si verificheranno due typecast in cui isviene utilizzata la parola chiave e solo un typecast in cui asviene utilizzata la parola chiave.

Nota: se stai utilizzando la isparola chiave per verificare alcune condizioni e non sei interessato al risultato di typecast, ci sarà solo un typecast, ad es.

if (baseclassInstance is DerivedClass)
{
   // do something based on the condition check.
}

ise le asparole chiave verranno utilizzate in base alla necessità.


6

La parola chiave is controlla se il valore sul lato sinistro è un'istanza del tipo sul lato destro. Per esempio:

if(obj is string)
{
     ...
}

Nota che in questo caso dovrai usare un cast esplicito extra per ottenere obj come stringa.

La parola chiave as viene utilizzata per eseguire il cast di tipi nullable. Se il valore specificato non è un'istanza del tipo specificato, viene restituito null. Per esempio:

string str = obj as string;
if(str != null)
{
     ...
}

+1 per "La parola chiave as viene utilizzata per eseguire il cast di tipi nullable".
user2330678

3

Direi: leggi MSDN online, ma eccolo qui:

L'operatore is controlla se un oggetto è compatibile con un determinato tipo e il risultato della valutazione è un booleano: true o false.

L'operatore as non genererà mai un'eccezione.


Anche l'operatore "as" non genererà un'eccezione, restituirà semplicemente null.
Pinte Dani

Corretto l'errore di battitura relativo a "è" e "come"
Patrick Peters

2

È l'operatore, un cast, restituisce true se riesce. Restituisce false se il cast fallisce. Con esso, non è possibile acquisire la variabile convertita. Questo operatore è molto utile quando si controllano i tipi nelle istruzioni if ​​ed espressioni L'is-cast è l'ideale solo se la variabile risultante non sarà necessaria per un ulteriore utilizzo

Come è un cast. Con esso, otteniamo prestazioni ed evitiamo eccezioni quando un cast non è valido. Null viene restituito quando il cast è impossibile. Per i tipi di riferimento, si consiglia l'as-cast. È sia veloce che sicuro. Possiamo testare la variabile risultante contro null e quindi usarla. Questo elimina lanci extra



2

is OPERATOR L'operatore is in C # viene utilizzato per controllare il tipo di oggetto e restituisce un valore bool: true se l'oggetto è dello stesso tipo e false in caso contrario. o anche L'operatore "is" viene utilizzato per verificare se il tipo di runtime di un oggetto è compatibile con un determinato tipo o meno. Per gli oggetti nulli, restituisce false ad es

if(obj is AnimalObject)
{
 //Then Work
}

come OPERATORE

L'operatore as fa lo stesso lavoro dell'operatore is ma la differenza è invece di bool, restituisce l'oggetto se sono compatibili con quel tipo, altrimenti restituisce null. In altre parole, l'operatore 'as' viene utilizzato per eseguire conversioni tra compatibili tipi.

per esempio

Type obj = Object as Type;

Vantaggi di as over is In caso di operatore is, per digitare cast, dobbiamo fare due passaggi:

Check the Type using is
If its true then Type cast

In realtà questo influisce sulle prestazioni poiché ogni volta che il CLR passerà attraverso la gerarchia di ereditarietà, controllando ogni tipo di base rispetto al tipo specificato.

Per evitare ciò, usa come, lo farà in un solo passaggio. Solo per verificare il tipo dovremmo usare l'operatore is.


Rispondere a domande vecchie di 8 anni che hanno già molte risposte valide non è il modo migliore per utilizzare Stack Overflow.
Claus Jørgensen

1

L'operatore As è simile a un cast, ma restituisce null invece di un'eccezione se fallisce.

E l'operatore Is viene utilizzato per verificare se un oggetto è compatibile con un certo tipo. Di solito viene utilizzato nelle istruzioni If.


1

is: L'operatore is viene utilizzato per verificare se il tipo di runtime di un oggetto è compatibile con un determinato tipo

as: L'operatore as viene utilizzato per eseguire conversioni tra tipi compatibili.

object s = "this is a test";
string str=string.Empty;
if( s is string)
    str = s as string;

2
La tua risposta è corretta, ma il tuo codice di esempio è un anti-pattern. È costoso da fare isallora as: si apre due volte. Per i tipi di riferimento, dovresti semplicemente farlo as, quindi controllare null per vedere se ha funzionato.
Steven Sudit

1

Dai un'occhiata al video di YouTube qui sotto che spiega la differenza in modo più dimostrativo e visivo: -

https://www.youtube.com/watch?v=IKmRtJcRX_I

Di seguito la risposta lunga con la spiegazione del codice.

La parola chiave "IS" è utile per verificare se gli oggetti sono compatibili con un tipo. Ad esempio, nel codice seguente stiamo controllando se l'oggetto "ocust" è un tipo di classe "Customer".

object ocust = new Customer();

if (ocust is Customer)
{ 

La parola chiave "AS" aiuta a fare la conversione da un tipo a un altro tipo. Ad esempio, nel codice seguente stiamo convertendo un oggetto in un tipo di dati stringa. Se la parola chiave "AS" non è in grado di digitare cast, restituisce NULL.

object o = "somestring";
string str = o as string;

1
MyClass myObject = (MyClass) obj;

vs

MyClass myObject = obj as MyClass;

Il secondo restituirà null se obj non è una MyClass, anziché generare un'eccezione di cast di classe.

è restituirà solo vero o falso


1

Sia IS che AS vengono utilizzati per il casting di tipo sicuro

Parola chiave IS -> controlla se il tipo di un dato oggetto è compatibile con il nuovo tipo di oggetto. Non genera mai un'eccezione. Questo è un tipo booleano .. restituisce vero o falso

`student stud = new student(){}
if(stud is student){} // It returns true // let say boys as derived class
if(stud is boys){}// It returns false since stud is not boys type
 //this returns true when,
student stud = new boys() // this return true for both if conditions.`

Parola chiave AS: controlla se il tipo di un dato oggetto è compatibile con il nuovo tipo di oggetto. Restituisce non nullo se l'oggetto dato è compatibile con quello nuovo, altrimenti nullo .. Questo genera un'eccezione.

`student stud = new student(){}
 // let say boys as derived class
boys boy = stud as boys;//this returns null since we cant convert stud type from base class to derived class
student stud = new boys()
boys boy = stud as boys;// this returns not null since the obj is pointing to derived class`

1

Entrambi gli operatori vengono utilizzati per la fusione di tipo sicuro.

Operatore AS:

L'operatore AS controlla anche se il tipo di un dato oggetto è compatibile con il nuovo tipo di oggetto. Questa parola chiave verificherà se il tipo di un dato oggetto è compatibile con il nuovo tipo di oggetto. Se non è compatibile con il nuovo, restituirà NULL.

Operatore IS:

Questo operatore controlla se il tipo di un oggetto è compatibile con il nuovo oggetto. Se è compatibile restituisce true altrimenti false.


Non pensi che sia un po 'troppo tardi come 4 anni?
Soner Gönül

Oh sì ... Scusa ... Sono nuovo di StackOverflow, quindi sono uscito un po '... Non ho notato la data di pubblicazione ...
Tukaram

Un contributo è un contributo! Grazie per aver indicato le parole chiave "Safe typecasting"! :-)
Musa Al-hassy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.