Esta es una pregunta tonta, pero puede usar este código para verificar si algo es un tipo particular ...
if (child is IContainer) { //....
¿Hay alguna 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 hay alguna pregunta sobre cómo se ve el código, es solo un simple retorno al comienzo de un método.
public void Update(DocumentPart part) {
part.Update();
if (!(DocumentPart is IContainer)) { return; }
foreach(DocumentPart child in ((IContainer)part).Children) {
//...etc...
if (!(argument is MapsControlViewModel vm)) { return; }
- Podría invertir el if y poner el resto del método whoooole dentro de los corchetes if, pero luego obtendría el código del árbol de Navidad, con muchos corchetes de cierre al final del método. Eso es mucho menos legible.ifnot
declaracionesRespuestas:
es el único operador que va (no hay
IsNot
operador).Puede crear un método de extensión que lo haga:
y luego úsalo para:
Y puedes seguir tu tema:
Actualización (considerando el fragmento de código del OP):
Como en realidad está emitiendo el valor después, podría usar
as
en su lugar:fuente
IsNot
nada.Puedes hacerlo de esta manera:
fuente
is
tiene mayor prioridad en relación con==
. La única razón por la que no puede usar!x is f
es que tiene menos prioridad que!
.if (a is TextReader reader == false)
"debería" funcionar, pero no le permitirá usar la variable en la ruta verdadera diciendo que podría no haberse inicializado.out
parámetros)if (a is TextReader reader == true)
que piensa que la variable no está inicializada.¿Por qué no solo usar el otro?
¿Está bien, es familiar y simple?
fuente
La forma en que la 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'".
Entonces podrías escribir:
fuente
Esto no ha sido mencionado todavía. Funciona y creo que se ve mejor que usar
!(child is IContainer)
is
sintaxis:,expr is constant
donde expr es la expresión para evaluar, y constante es el valor para probar.fuente
if (part as IContainer is null)
. Sinceramente, no estoy seguro de cuál es mejor.¿Feo? Estoy en desacuerdo. La única otra forma (personalmente creo que esto es "más feo"):
fuente
as
cláusula.obj as int
es siempre un error de tiempo de compilación.is
forma.El
is
operador evalúa a un resultado booleano, por lo que puede hacer cualquier cosa que de otro modo podría hacer en un bool. Para negarlo, use el!
operador. ¿Por qué querrías tener un operador diferente solo para esto?fuente
El método de extensión
IsNot<T>
es una buena manera de extender la sintaxis. Tenga en cuentafunciona mejor que hacer algo como
En su caso, no importa ya que regresa del método. En otras palabras, tenga cuidado de no hacer tanto la verificación de tipo como la conversión de tipo inmediatamente después.
fuente
Si bien esto no evita el problema de los paréntesis, por el bien de las personas que llegan aquí a través de Google, debe mencionarse que existe una sintaxis más nueva (a partir de C # 7) para que el resto de su código sea un poco más limpio:
Esto evita la doble conversión, la verificación nula y tener una variable disponible en ámbitos donde podría ser nula.
fuente
Si bien el operador IS normalmente es la mejor manera, existe una alternativa que puede usar en algunas circunstancias. Puede usar el operador as y probar nulo.
fuente
C # 9 (que se publicará con .NET 5) incluirá los patrones lógicos
and
,or
ynot
, lo que nos permite escribir esto más elegante:Del mismo modo, este patrón se puede utilizar para verificar nulo:
Puede encontrar más detalles sobre el problema de Github que rastrea este cambio.
fuente
fuente