2010-07-09 20 views
43

Se una matrice è vuota, sembra che non sia possibile controllarne la lunghezza usando ".length". Qual è il modo migliore per verificare se un array è vuoto?If (Array.Length == 0)

risposta

117

Si può assolutamente controllare uno vuoto della lunghezza dell'array. Tuttavia, se provi a farlo su un riferimento null otterrai un'eccezione. Sospetto che sia quello che stai scontando. Puoi comunque far fronte a entrambi:

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

Se questa non è la causa, si prega di fornire un breve ma completo programma che dimostri il problema. Se quello era la causa, vale la pena prendersi un momento per assicurarsi di comprendere riferimenti null vs "vuoti" collezioni/stringhe/qualsiasi cosa.

+0

In quale situazione un array avrà .Lunghezza == 0? Una matrice dimensionata alla dimensione 0? – sooprise

+8

... un array vuoto. –

+0

@Soo: Sì, esattamente. –

13

Sì, per la sicurezza avrei probabilmente fare:

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

È possibile utilizzare .Length == 0 se la lunghezza è vuota ed esiste la matrice, ma sei sicuro che non è nulla?

2

Questo è il modo migliore. Si prega di notare che Array è un oggetto in NET quindi è necessario verificare prima null.

0

vuoi dire vuoto o nullo, due cose diverse,

se la matrice è istanziato, ma vuota, poi la lunghezza è corretta, se non è stata creata un'istanza poi prova vs nulla

1

Il test suggerito è bene, fino a quando la matrice è intializzata ...

Martin.

2

Come altri hanno già suggerito è probabile che si ottenga un NullReferenceException che può essere evitato verificando prima di vedere se il riferimento è null. Tuttavia, è necessario chiedersi se tale controllo sia effettivamente giustificato. Lo faresti perché il riferimento potrebbe essere davvero null e il suo null ha un significato speciale nel tuo codice? O lo faresti per coprire un insetto? La natura della domanda mi porta a credere che sarebbe il secondo. In tal caso, è necessario esaminare il codice in modo approfondito e capire perché il riferimento non è stato inizializzato correttamente in primo luogo.

2

Jon Skeet ha risposto correttamente. Ricorda solo che l'ordine del test in "IF" è importante. Verifica il valore nullo prima della durata. Preferisco anche mettere il null sul lato sinistro dell'uguale ... solo un'abitudine che ho ricevuto da Java che ha reso il codice più efficiente e veloce ... Non penso che sia importante in molte applicazioni oggi, ma è una buona pratica.

se (null == matrice || Array.length == 0)

1

se (array.length> 0)

+2

potresti almeno dire perché hai buttato giù ... cosa c'è di sbagliato con Questo? – Wills

+0

Ciò provocherà un'eccezione di riferimento null se "array" è null. – computerGuyCJ

+0

per una cosa, il tuo caso è spento; questo non è valido C# come scritto –

3

È possibile utilizzare

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

O

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

NOTA !!!!! Per assicurare che C# implementerà correttamente il cortocircuito; devi confrontare l'oggetto con NULL prima di andare al confronto dei bambini dell'oggetto.

1

di controllo se l'array è nullo prima in modo che avrebbe evitare un'eccezione puntatore nullo

logica in qualsiasi lingua: se array è nullo o è vuota: fare ....

0

Se array è null, cercando di derefrence array.Length getterà un NullReferenceException. Se il codice considera null un valore non valido per array, è necessario rifiutarlo e dare la colpa al chiamante. Un tale modello è quello di gettare ArgumentNullException:

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

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

Se si desidera accettare una matrice null come indicazione di non fare qualcosa o come un parametro opzionale, si può semplicemente non accedervi se è nullo:

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

Se si desidera evitare di toccare array quando è o null o ha lunghezza zero, è possibile verificare entrambi allo stesso tempo con C#-6’s null coalescing operator.

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

Superfluo Lunghezza check

Sembra strano che si sta trattando la matrice vuota come un caso speciale. In molti casi, se tu, ad esempio, esegui semplicemente il loop sull'array in ogni caso, non è necessario trattare l'array vuoto come caso speciale. foreach (var elem in array) {«body»} semplicemente non eseguirà mai «body» quando array.Length è 0. Se stai curando lo array == null || array.Length == 0 in particolare per, ad es., Migliorare le prestazioni, potresti considerare di lasciare un commento per i posteri. In caso contrario, il controllo di Length == 0 appare superfluo.

Il codice superfluo rende la comprensione di un programma più difficile perché le persone che leggono il codice presumono che ogni riga sia necessaria per risolvere qualche problema o raggiungere la correttezza. Se includi codice non necessario, i lettori passeranno per sempre a cercare di capire perché questa linea è o era necessaria prima di eliminarla ;-).