2011-06-06 17 views
9

¿El operador is indicar si o no un objeto es una instancia de cierta clase, o sólo si que se puede lanzar a esa clase?C# 'es' operador Aclaración

Supongamos que tengo un DbCommand llamado command que en realidad se ha inicializado como SqlCommand. ¿Cuál es el resultado de command is OracleCommand?

(SqlCommand y OracleCommand tanto heredan de DbCommand)

+0

¿No sería falso el resultado, porque ni DbCommand ni SqlCommand son instancias de OracleCommand? –

+0

'is' indica si un objeto es una instancia del tipo o derivada del mismo. http://msdn.microsoft.com/en-us/library/scekt9xw(v=VS.100).aspx – Jon

+0

@they: ¿No son esas dos definiciones las mismas? – Mehrdad

Respuesta

18

Se comprueba si el objeto es un miembro de ese tipo, o de un tipo que hereda de o implementa el tipo base o interfaz. En cierto modo, verifica si el objeto puede convertirse a dicho tipo.

command is OracleCommand devuelve falso, ya que es un SqlCommand, no un OracleCommand. Sin embargo, tanto command is SqlCommand como command is DbCommand devolverán verdadero ya que es un miembro de ambos tipos y, por lo tanto, pueden ser downcast o upcast a, respectivamente.

Si tiene tres niveles de herencia, p. BaseClass, SubClass y SubSubClass, un objeto inicializado como new SubClass() solo devuelve verdadero para is BaseClass y . Aunque SubSubClass se deriva de ambos, el objeto en sí no es una instancia de este, por lo que is SubSubClass devuelve falso.

1

is indican si el objeto se puede lanzar a una clase o interfaz.

Si usted tiene un BaseClass y una subclase a continuación:

var obj = new SubClass(); 

obj is SubClass devuelve true;

obj is BaseClass también devuelve verdadero;

+1

Si desea comparar con el tipo real, use 'command.GetType(). Equals (typeof (SqlCommand))'. – Jess

+0

¿Qué ocurre con los tipos no relacionados con un operador de conversión explícito para convertir entre ellos? –

6

Un is expresión se evalúa a verdadero si la expresión proporcionada es no nulo, y el objeto proporcionado se puede lanzar al tipo proporcionado sin causar una excepción a ser lanzado.

Source

4

De MSDN:

Una es la expresión es verdadera si [...] expresión se puede colar para escribir

0

si (algo es X) comprueba si el tipo subyacente de algo es X. Esto es significativamente diferente de comprobar si un tipo admite conversión a X ya que muchos tipos pueden admitir conversiones a X sin ser del tipo X.

la inversa, la como operador intenta una conversión a un tipo particular y asigna nula si el tipo de fuente no está dentro de la cadena de herencia del tipo de destino.