Diferencia entre es y como palabra clave


121

Indique cuál es la diferencia entre una palabra clave isy asen C #



3
Si está interesado en este tema, probablemente también quiera saber cuál es la diferencia entre los operadores "como" y "emitir": blogs.msdn.com/b/ericlippert/archive/2009/10/08/…
Eric Lippert

7
¿Le gustaría marcar la respuesta como aceptada? Ayudaría a otros que buscan una respuesta similar.
KMån

Respuestas:


151

es

El isoperador comprueba si un objeto se puede convertir a un tipo específico.

Ejemplo:

if (someObject is StringBuilder) ...

como

El asoperador intenta convertir un objeto a un tipo específico y devuelve nulo si falla.

Ejemplo:

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

También relacionado:

Fundición

El operador de conversión intenta convertir un objeto en un tipo específico y lanza una excepción si falla.

Ejemplo:

StringBuilder b = (StringBuilder)someObject.

4
Eso no es correcto. isno comprueba si un objeto se puede convertir a un tipo específico. Un entero se convierte en una multa larga pero 10 is longes falso.
Martin Smith

9
@MartinSmith: Estás mezclando la conversión de tipos con el casting. Un número entero se puede convertir en largo, pero no se puede convertir en largo porque no es largo.
Guffa

2
¿Me estás diciendo que un número entero no se puede convertir en largo? ¿Eso (long)some_integerfallará? Estoy bastante seguro de que ambos sabemos que eso no es cierto sin siquiera ejecutarlo, así que explique lo que quiere decir.
Martin Smith

12
@MartinSmith: Sigues confundiendo el casting con la conversión. No estás convirtiendo un entero en largo, estás convirtiendo un entero en largo. Aunque usan la misma sintaxis, las referencias se convierten y los valores se convierten.
Guffa

2
Nota sobreis : " Tenga en cuenta que el operador is solo considera conversiones de referencia, conversiones de boxeo y conversiones de unboxing. No se consideran otras conversiones, como las conversiones definidas por el usuario " . (Msdn.microsoft.com/en-us/library/scekt9xw .aspx). Acerca deas : " Tenga en cuenta que el operador as solo realiza conversiones de referencia, conversiones que aceptan valores NULL y conversiones de boxing. El operador as no puede realizar otras conversiones, como conversiones definidas por el usuario, que en su lugar deben realizarse mediante expresiones de conversión " . ( aceptan valores conversión Msdn .microsoft.com / en-us / library / cscsdfbt.aspx )
user1234567

33

La diferencia entre IS y As es que ...

IS : el operador Is se utiliza para verificar la compatibilidad de un objeto con un tipo determinado y devuelve el resultado como un booleano (verdadero o falso).

AS : como operador se utiliza para convertir un objeto en un tipo o clase determinados.

Ex.

Student s = obj as Student;

es equivalente a:

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

1
¡La equivalencia muestra claramente cuál de los dos es más primitivo y subyace elegantemente en su relación! ¡Gracias por la equivalencia!
Musa Al-hassy

1
@ MusaAl-hassy En realidad, esto no muestra cuál es más primitivo. isse puede expresar con asy asse puede expresar con is. Aquí se explica cómo hacer una iscon la aspalabra clave. Bool b = obj is Student; es equivalente a: Bool b = (obj as Student) != null; Más sobre esto aquí
Alex Telon

8

Tanto isy aspalabras clave se utilizan para la conversión de tipos en C #.

Cuando eche un vistazo al código IL de usos de ambas palabras clave, obtendrá la diferencia fácilmente.

Código 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
}

Código IL (para el código C # anterior está en la imagen adjunta):

Código IL para el código C # anterior El código IL para el isuso de palabras clave contiene instrucciones IL isinstay castclass.
Pero el código IL para el asuso de palabras clave solo tiene isinsta.

En el uso mencionado anteriormente, ocurrirán dos encasillamientos donde isse use la palabra clave y solo un encasillado dondeas se use la palabra clave.

Nota: Si está usando una ispalabra clave para verificar alguna condición y no tiene ningún interés en el resultado del encasillado, entonces solo habrá un encasillado, es decir

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

isy las aspalabras clave se utilizarán según la necesidad.


6

La palabra clave is comprueba si el valor de su lado izquierdo es una instancia del tipo del lado derecho. Por ejemplo:

if(obj is string)
{
     ...
}

Tenga en cuenta que, en este caso, tendrá que usar una conversión explícita adicional para obtener obj como cadena.

La palabra clave as se utiliza para convertir tipos que aceptan valores NULL. Si el valor especificado no es una instancia del tipo especificado, se devuelve un valor nulo. Por ejemplo:

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

+1 para "La palabra clave as se utiliza para convertir tipos que aceptan valores NULL".
user2330678

3

Yo diría: lea MSDN en línea, pero aquí está:

El operador is comprueba si un objeto es compatible con un tipo determinado y el resultado de la evaluación es un booleano: verdadero o falso.

El operador as nunca lanzará una excepción.


El operador "como" tampoco arrojará una excepción, solo devolverá nulo.
Pinte Dani

Se corrigió el error tipográfico con respecto a 'es' y 'como'
Patrick Peters

2

Es operador, un elenco, devuelve verdadero si tiene éxito. Devuelve falso si el elenco falla. Con él, no puede capturar la variable convertida. Este operador es más útil cuando se verifican tipos en sentencias if y expresiones. Is-cast solo es ideal si la variable resultante no será necesaria para un uso posterior

Como es un yeso. Con él, ganamos rendimiento y evitamos excepciones cuando un elenco no es válido. Se devuelve nulo cuando el reparto es imposible. Para los tipos de referencia, se recomienda el modelo as-cast. Es rápido y seguro. Podemos probar la variable resultante contra nula y luego usarla. Esto elimina yesos adicionales



2

es OPERADOR El operador is en C # se usa para verificar el tipo de objeto y devuelve un valor bool: verdadero si el objeto es del mismo tipo y falso si no. o también El operador "es" se utiliza para comprobar si el tipo de tiempo de ejecución de un objeto es compatible con un tipo determinado o no. Para objetos nulos, devuelve falso, por ejemplo

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

como OPERADOR

El operador as hace el mismo trabajo que el operador is, pero la diferencia es que en lugar de bool, devuelve el objeto si son compatibles con ese tipo, de lo contrario devuelve nulo En otras palabras, el operador 'as' se usa para realizar conversiones entre compatibles tipos.

p.ej

Type obj = Object as Type;

Ventajas de as over is En el caso del operador is, para escribir cast, debemos seguir dos pasos:

Check the Type using is
If its true then Type cast

En realidad, esto afecta el rendimiento ya que todas y cada una de las veces que CLR pasará por la jerarquía de herencia, verificando cada tipo base con el tipo especificado.

Para evitar esto, use como, lo hará en un solo paso. Solo para verificar el tipo debemos usar el operador is.


Responder preguntas de 8 años que ya tienen muchas respuestas válidas no es la mejor manera de usar Stack Overflow.
Claus Jørgensen

1

El operador As es similar a una conversión, pero devuelve un valor nulo en lugar de una excepción si falla.

Y el operador Is se utiliza para comprobar si un objeto es compatible con un tipo determinado. Por lo general, se usa en declaraciones If.


1

is: El operador is se usa para verificar si el tipo de tiempo de ejecución de un objeto es compatible con un tipo dado

as: El operador as se utiliza para realizar conversiones entre tipos compatibles.

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

2
Su respuesta es correcta, pero su código de muestra es un anti-patrón. isEntonces es caro as: se abre dos veces. Para los tipos de referencia, simplemente debe hacerlo as, luego verifique si existe un valor nulo para ver si funcionó.
Steven Sudit

1

Eche un vistazo al video de YouTube a continuación que explica la diferencia de una manera más demostrativa y visual:

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

A continuación se muestra la respuesta larga con la explicación del código.

La palabra clave "IS" es útil para comprobar si los objetos son compatibles con un tipo. Por ejemplo, en el siguiente código, estamos comprobando si el objeto "ocust" es un tipo de clase "Cliente".

object ocust = new Customer();

if (ocust is Customer)
{ 

La palabra clave "AS" ayuda a realizar conversiones de un tipo a otro. Por ejemplo, en el siguiente código, estamos convirtiendo el objeto a un tipo de datos de cadena. Si la palabra clave "AS" no puede escribir cast, devuelve NULL.

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

1
MyClass myObject = (MyClass) obj;

vs

MyClass myObject = obj as MyClass;

El segundo devolverá nulo si obj no es MyClass, en lugar de lanzar una excepción de conversión de clase.

solo devolverá verdadero o falso


1

Tanto IS como AS se utilizan para la fundición de tipo seguro

IS Keyword -> comprueba si el tipo de un objeto dado es compatible con el nuevo tipo de objeto. Nunca lanza una excepción. Este es un tipo booleano ... devuelve verdadero 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.`

AS Keyword: comprueba si el tipo de un objeto dado es compatible con el nuevo tipo de objeto. Devuelve un valor no nulo si el objeto dado es compatible con uno nuevo, de lo contrario es nulo. Esto genera una excepción.

`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

Ambos operadores se utilizan para la fundición de tipo seguro.

Como operador:

El operador AS también comprueba si el tipo de un objeto dado es compatible con el nuevo tipo de objeto. Esta palabra clave comprobará si el tipo de un objeto dado es compatible con el nuevo tipo de objeto. Si no es compatible con el nuevo, devolverá NULL.

Operador IS:

Este operador comprueba si el tipo de objeto es compatible con el nuevo objeto. Si es compatible, devuelve verdadero; de lo contrario, falso.


¿No crees que es un poco tarde como 4 años?
Soner Gönül

Ohh, sí ... Lo siento ... Soy nuevo en stackoverflow, por lo que poco salió ... No me di cuenta de la fecha publicada ...
Tukaram

¡Una contribución es una contribución! ¡Gracias por señalar las palabras clave "Encasillado seguro"! :-)
Musa Al-hassy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.