I often come across code like the following:
if ( items != null)
{
foreach(T item in items)
{
//...
}
}
Basically, the if
condition ensures that foreach
block will execute only if items
is not null. I'm wondering if the if
condition is really needed, or foreach
will handle the case if items == null
.
I mean, can I simply write
foreach(T item in items)
{
//...
}
without worrying about whether items
is null or not? Is the if
condition superfluous? Or this depends on the type of items
or maybe on T
as well?
It is not superflous. At runtime items will be casted to an IEnumerable and its GetEnumerator method will be called. That will cause a dereferencing of items that will fail
The test is necessary, because if the collection is null, foreach will throw a NullReferenceException. It's actually quite simple to try it out.
the second will throw a
NullReferenceException
with the messageObject reference not set to an instance of an object.
In C# 6 you can write sth like this:
It's basically Vlad Bezden's solution but using the ?? expression to always generate an array that is not null and therefore survives the foreach rather than having this check inside the foreach bracket.
The real takeaway here should be a sequence should almost never be null in the first place. Simply make it an invariant in all of your programs that if you have a sequence, it is never null. It is always initialized to be the empty sequence or some other genuine sequence.
If a sequence is never null then obviously you don't need to check it.
You do need this. You'll get an exception when
foreach
accesses the container to set up the iteration otherwise.Under the covers,
foreach
uses an interface implemented on the collection class to perform the iteration. The generic equivalent interface is here.