utilizadas términos significa reservadas que palabras net lenguaje instrucciones glosario framework comandos codigos claves clave c# keyword

términos - palabras reservadas utilizadas en c#



C#: palabra clave ''is'' y comprobación de No (10)

Esta es una pregunta tonta, pero puedes usar este código para verificar si algo es de un tipo en particular ...

if (child is IContainer) { //....

¿Hay una forma más elegante de verificar la instancia "NO"?

if (!(child is IContainer)) { //A little ugly... silly, yes I know... //these don''t work :) if (child !is IContainer) { if (child isnt IContainer) { if (child aint IContainer) { if (child isnotafreaking IContainer) {

Sí, sí ... pregunta tonta ....

Debido a que existe alguna duda sobre el aspecto del código, es solo un simple retorno al inicio de un método.

public void Update(DocumentPart part) { part.Update(); if (!(DocumentPart is IContainer)) { return; } foreach(DocumentPart child in ((IContainer)part).Children) { //...etc...


¿Feo? Estoy en desacuerdo. La única otra forma (personalmente creo que esto es "más feo"):

var obj = child as IContainer; if(obj == null) { //child "aint" IContainer }


¿Por qué no usar simplemente el otro?

if (child is IContainer) { // } else { // Do what you want here }

¿Es limpio familiar y simple?


El método de extensión IsNot<T> es una buena forma de extender la sintaxis. Tenga en cuenta

var container = child as IContainer; if(container != null) { // do something w/ contianer }

funciona mejor que hacer algo como

if(child is IContainer) { var container = child as IContainer; // do something w/ container }

En su caso, no importa cuando regrese del método. En otras palabras, tenga cuidado de no realizar tanto la verificación del tipo como la conversión de tipos inmediatamente después.


El operador is evalúa a un resultado booleano, por lo que puede hacer cualquier cosa que de otra manera podría hacer en un bool. Para negarlo usa el ! operador. ¿Por qué querrías tener un operador diferente solo para esto?


La forma en que lo tiene está bien, pero podría crear un conjunto de métodos de extensión para hacer "una forma más elegante de verificar la instancia ''NO''".

public static bool Is<T>(this object myObject) { return (myObject is T); } public static bool IsNot<T>(this object myObject) { return !(myObject is T); }

Entonces podrías escribir:

if (child.IsNot<IContainer>()) { // child is not an IContainer }


Puedes hacerlo de esta manera:

object a = new StreamWriter("c://temp//test.txt"); if (a is TextReader == false) { Console.WriteLine("failed"); }


Si bien el operador de SI es normalmente la mejor manera, hay una alternativa que puede usar en algunas circunstancias. Puede utilizar el operador as y probar para nulo.

MyClass mc = foo as MyClass; if ( mc == null ) { } else {}


Si bien esto no evita el problema de los paréntesis, por el bien de las personas que llegan a través de Google, debe mencionarse que existe una sintaxis más nueva (a partir de C # 7) para hacer que el resto de su código sea un poco más claro:

if (!(DocumentPart is IContainer container)) { return; } foreach(DocumentPart child in container.Children) { ...

Esto evita el doble lanzamiento, la comprobación de nulos y tener una variable disponible en ámbitos donde podría ser nulo.


if (child is IContainer ? false : true)


if(!(child is IContainer))

es el único operador que va (no hay IsNot operador de IsNot ).

Puedes construir un método de extensión que lo haga:

public static bool IsA<T>(this object obj) { return obj is T; }

y luego usarlo para:

if (!child.IsA<IContainer>())

Y puedes seguir sobre tu tema:

public static bool IsNotAFreaking<T>(this object obj) { return !(obj is T); } if (child.IsNotAFreaking<IContainer>()) { // ...

Actualización (considerando el fragmento de código del OP):

Ya que en realidad estás lanzando el valor después, podrías usar as :

public void Update(DocumentPart part) { part.Update(); IContainer containerPart = part as IContainer; if(containerPart == null) return; foreach(DocumentPart child in containerPart.Children) { // omit the cast. //...etc...