Первый будет работать для любого массива , включая прямоугольные массивы и массивы с ненулевой нижней границей.Он также будет работать, когда тип времени компиляции массива просто Array
, что может случаться очень редко с довольно слабым типом API.
Короче говоря, первый является более общим и должен работать где угодночто делает второй.
(я предполагаю, что вы не хотите от этого каких-либо «дополнительных» функций, таких как дополнительные ограничения для T
во второй форме ...вам просто нужно что-то, что будет определять, является ли ссылка на массив нулевой или ссылается на пустой массив.)
РЕДАКТИРОВАТЬ: Для IEnumerable
вы должны использовать:
public static bool IsNullOrEmpty(this IEnumerable value)
{
if (value == null)
{
return true;
}
var iterator = value.GetEnumerator();
try
{
return !iterator.MoveNext();
}
finally
{
// Non-generic IEnumerator doesn't extend IDisposable
IDisposable disposable = iterator as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
}
недостатком этого, конечно, является то, что он может очень легко иметь побочные эффекты - например, вы можете передать запрос LINQ, который в конечном итоге будет говорить с базой данных.