2010-07-09 8 views
43

Si una matriz está vacía, parece que no puede verificar su longitud con ".length". ¿Cuál es la mejor manera de verificar si una matriz está vacía?If (Array.Length == 0)

Respuesta

117

Puede verificar absolutamente longitud de la matriz vacía. Sin embargo, si intenta hacer eso en una referencia nula, obtendrá una excepción. Sospecho que es con lo que te estás metiendo. Puede hacer frente a ambos aunque:

if (array == null || array.Length == 0) 

Si esa no es la causa, proporcione un programa breve pero completo que demuestre el problema. Si ese fue la causa, vale la pena tomarse un momento para asegurarse de que comprende referencias nulas frente a colecciones/cadenas "vacías"/lo que sea.

+0

¿En qué situación tendría una matriz .Length == 0? ¿Una matriz dimensionada para el tamaño 0? – sooprise

+8

... una matriz vacía. –

+0

@Soo: Sí, exactamente. –

13

Sí, por la seguridad que probablemente hago:

if(array == null || array.Length == 0) 
4

Puede utilizar .Length == 0 si la longitud está vacío y existe la matriz, pero ¿estás seguro de que no es nula?

2

Esta es la mejor manera. Tenga en cuenta que Array es un objeto en NET, por lo que debe comprobar antes si es nulo.

0

Qué quiere decir vacía o nula, dos cosas diferentes,

si la matriz se crea una instancia, pero vacía, entonces la longitud es correcta, si no se ha creado una instancia luego probar vs nula

1

Su análisis propuesto es bien, siempre que la matriz esté inicializada ...

Martin.

2

Como otros ya han sugerido, es probable que obtenga un NullReferenceException que se puede evitar verificando primero si la referencia es null. Sin embargo, debe preguntarse si ese cheque está realmente justificado. ¿Lo estarías haciendo porque la referencia realmente podría ser null y siendo null tiene un significado especial en tu código? ¿O lo estarías haciendo para encubrir un error? La naturaleza de la pregunta me lleva a creer que sería la última. En ese caso, realmente necesita examinar el código en profundidad y averiguar por qué esa referencia no se inicializó correctamente en primer lugar.

2

Jon Skeet respondió correctamente. Solo recuerde que el orden de la prueba en "IF" es importante. Compruebe el valor nulo antes de la longitud. También prefiero poner el nulo en el lado izquierdo de la igualdad ... solo un hábito que obtuve de Java que hizo que el código fuera más eficiente y rápido ... No creo que hoy en día sea importante en muchas aplicaciones, pero es una buena práctica.

si (null == matriz || Array.length == 0)

1

si (Array.length> 0)

+2

por lo menos podrías decir por qué lo detuviste ... qué pasa con ¿esta? – Wills

+0

Esto dará como resultado una excepción de referencia nula si "matriz" es nula. – computerGuyCJ

+0

por un lado, su estuche está apagado; esto no es válido C# como está escrito –

3

Puede utilizar

if (array == null || array.Length == 0) 

O

if (!(array != null && array.Length >= 0)) 

NOTA !!!!! Para asegurar que C# implementará el cortocircuito correctamente; tienes que comparar ese objeto con NULL antes de ir a la comparación de los niños del objeto.

1

de verificación si la matriz es nulo primero para que se evitaría una excepción de puntero nulo

lógica en cualquier idioma: si la matriz es nulo o está vacía: hacer ....

0

Si array es null, tratando de eliminar array.Length lanzará un NullReferenceException. Si su código considera que null es un valor no válido para array, debe rechazarlo y culpar a la persona que llama. Uno de estos patrones es lanzar ArgumentNullException:

void MyMethod(string[] array) 
{ 
    if (array == null) throw new ArgumentNullException(nameof(array)); 

    if (array.Length > 0) 
    { 
     // Do something with array… 
    } 
} 

Si desea aceptar una matriz null como una indicación de no hacer algo o como un parámetro opcional, es posible que simplemente no acceder a ella si es nulo:

void MyMethod(string[] array) 
{ 
    if (array != null) 
    { 
     // Do something with array here… 
    } 
} 

Si desea evitar tocar array cuando es null o tiene longitud cero, puede verificar ambos al mismo tiempo con C#-6’s null coalescing operator.

void MyMethod(string[] array) 
{ 
    if (array?.Length > 0) 
    { 
     // Do something with array… 
    } 
} 

superfluo Duración Fecha

Parece extraño que está tratando la matriz vacía como un caso especial. En muchos casos, si usted, por ejemplo, simplemente recorrera la matriz de todos modos, no es necesario tratar la matriz vacía como un caso especial. foreach (var elem in array) {«body»} simplemente nunca ejecutará «body» cuando array.Length es 0. Si está tratando array == null || array.Length == 0 especialmente para, por ejemplo, mejorar el rendimiento, puede considerar dejar un comentario para la posteridad. De lo contrario, el cheque para Length == 0 parece superfluo.

El código superfluo hace que la comprensión de un programa sea más difícil porque las personas que leen el código probablemente suponen que cada línea es necesaria para resolver algún problema o lograr la corrección. Si incluye un código innecesario, los lectores pasarán una eternidad tratando de descubrir por qué esa línea es o fue necesaria antes de eliminarla ;-).

Cuestiones relacionadas