Często napotykam kod podobny do następującego:
if ( items != null)
{
foreach(T item in items)
{
//...
}
}
Zasadniczo if
warunek zapewnia, że foreach
blok zostanie wykonany tylko wtedy, gdy items
nie jest pusty. Zastanawiam się, czy if
stan jest naprawdę potrzebny, czy poradzę foreach
sobie w przypadku items == null
.
To znaczy, mogę po prostu napisać
foreach(T item in items)
{
//...
}
bez martwienia się o items
to, czy jest zerowy, czy nie? Czy if
stan jest zbędny? Czy to zależy od typu z items
lub może on T
także?
null
) uogólniając całą pętlę na wyświetlaczu LCDEnumerable
(jak użycie??
byłoby ), b) wymagają dodania metody rozszerzenia do każdego projektu, lub c) wymagają unikanianull
IEnumerable
s (Pffft! Puh-LEAZE! SMH.) na początku (bo,null
oznacza N / A, podczas gdy pusta lista oznacza, że jest stosowana, ale jest obecnie, cóż, pusty !, tj. pracownik może mieć prowizje, które nie dotyczą sprzedaży, lub są puste w przypadku sprzedaży, jeśli nie zarobili).Odpowiedzi:
Nadal musisz sprawdzić, czy (items! = Null), w przeciwnym razie otrzymasz NullReferenceException. Możesz jednak zrobić coś takiego:
ale możesz sprawdzić jego wydajność. Więc nadal wolę mieć najpierw if (items! = Null).
Na podstawie sugestii Erica Lipperta zmieniłem kod na:
źródło
IEnumerable<T>
która z kolei degraduje się do modułu wyliczającego do interfejsu, co spowalnia iterację. Mój test wykazał degradację 5-krotną dla iteracji w tablicy int.Używając C # 6, możesz użyć nowego operatora warunkowego o wartości null razem z
List<T>.ForEach(Action<T>)
(lub własnąIEnumerable<T>.ForEach
metodą rozszerzającą).źródło
null
) uogólniania całej pętli na LCDEnumerable
(jak przy użyciu??
), b) wymaga dodania metody rozszerzenia do każdego projektu lub c ) wymagają unikanianull
IEnumerable
s (Pffft! Puh-LEAZE! SMH.) na początku (bo,null
oznacza N / A, podczas gdy pusta lista oznacza, że jest stosowana, ale obecnie jest, no cóż, pusta !, tj. Empl. może mieć Prowizje, które Nie dotyczy w przypadku pozycji niesprzedanych lub pustych w przypadku sprzedaży, jeśli nie zarobili).items
jest toList<T>
raczej myślenie niż byle jakieIEnumerable<T>
. (Lub skorzystaj z niestandardowej metody rozszerzenia, o której powiedziałeś, że nie chcesz ...) Ponadto powiedziałbym, że naprawdę nie warto dodawać 11 komentarzy, a wszystkie zasadniczo mówią, że podoba ci się konkretna odpowiedź.foreach
. Szczególnie w przypadku listy, która moim zdaniem zostanie przekonwertowana nafor
pętlę.Prawdziwym rozwiązaniem na wynos powinien być ciąg, który prawie nigdy nie powinien być zerowy . Po prostu uczyń niezmiennym we wszystkich swoich programach, że jeśli masz sekwencję, nigdy nie jest zerowa. Jest zawsze inicjowana jako pusta sekwencja lub inna oryginalna sekwencja.
Jeśli sekwencja nigdy nie jest zerowa, to oczywiście nie musisz jej sprawdzać.
źródło
null
) uogólniając całą pętlę na wyświetlaczu LCDEnumerable
(jak użycie??
byłoby ), b) wymagają dodania metody rozszerzenia do każdego projektu, lub c) wymagają unikanianull
IEnumerable
s (Pffft! Puh-LEAZE! SMH.) na początku (bo,null
oznacza N / A, podczas gdy pusta lista oznacza, że jest stosowana, ale jest obecnie, cóż, pusty !, tj. pracownik może mieć prowizje, które nie dotyczą sprzedaży, lub są puste w przypadku sprzedaży, jeśli nie zarobili).Właściwie na tym @Connect jest żądanie funkcji: http://connect.microsoft.com/VisualStudio/feedback/details/93497/foreach-should-check-for-null
Odpowiedź jest całkiem logiczna:
źródło
Zawsze możesz to przetestować z pustą listą ... ale to właśnie znalazłem na stronie internetowej msdn
źródło
Nie jest to zbyteczne. W czasie wykonywania elementy zostaną rzutowane na IEnumerable i zostanie wywołana metoda GetEnumerator. Spowoduje to wyłuskanie elementów, które się nie powiodą
źródło
IEnumerable
i 2) Decyzja o rzuceniu jest decyzją projektową. C # może łatwo wstawićnull
sprawdzenie, czy programiści uznali to za dobry pomysł.Możesz hermetyzować sprawdzanie wartości null w metodzie rozszerzenia i użyć wyrażenia lambda:
Kod staje się:
Jeśli może być jeszcze bardziej zwięzłe, jeśli chcesz po prostu wywołać metodę, która pobiera element i zwraca
void
:źródło
Potrzebujesz tego. Otrzymasz wyjątek, kiedy
foreach
dostęp do kontenera, aby skonfigurować iterację w inny sposób.Pod okładkami
foreach
używa interfejsu zaimplementowanego w klasie kolekcji do wykonania iteracji. Ogólny odpowiednik interfejsu jest tutaj .źródło
Test jest konieczny, ponieważ jeśli kolekcja ma wartość null, foreach zgłosi NullReferenceException. Właściwie to całkiem proste, aby to wypróbować.
źródło
druga wyśle
NullReferenceException
z wiadomościąObject reference not set to an instance of an object.
źródło
Jak wspomniano tutaj , musisz sprawdzić, czy nie jest to wartość zerowa.
źródło
W C # 6 możesz napisać coś tak:
Jest to w zasadzie rozwiązanie Vlada Bezdena, ale przy użyciu ?? expression, aby zawsze generować tablicę, która nie jest null i dlatego przetrwa foreach zamiast sprawdzania wewnątrz nawiasu foreach.
źródło