Można użyć operatora params
parametr przekazać listę parametrów zerowych:
public static void ThrowIfNull(params object[] input)
{
foreach (var item in input)
{
//Your choice of how you want to handle this. I chose an exception.
throw new NullReferenceException();
}
}
który pozwoli Ci:
int? nullableInt = null;
string someNullString = null;
ThrowIfNull(nullableInt, someNullString);
Istnieją także inne sposoby podejścia do tego problemu . Na przykład można utworzyć metodę rozszerzenia dla IEnumerable
:
public static class NullExtensionMethods
{
public static void ThrowIfHasNull<T>(this IEnumerable collection)
where T : Exception, new()
{
foreach (var item in collection)
{
if (item == null)
{
throw new T();
}
}
}
public static void ThrowIfHasNull(this IEnumerable collection)
{
ThrowIfHasNull<NullReferenceException>(collection);
}
}
Making to możliwe:
string someNullString = null;
new string[] { someNullString }.ThrowIfHasNull();
//or for context specific exceptions
new string[] { someNullString }.ThrowIfHasNull<ArgumentNullException>();
Choć wolę uniknąć wyjątki, gdzie to możliwe. Można wprowadzić następujące zmiany:
public static class NullExtensionMethods
{
public static bool HasNull(this IEnumerable collection)
{
foreach (var item in collection)
{
if (item == null)
{
return true;
}
}
return false;
}
}
Pozwala na dużo bardziej wdzięcznie obsłużyć rzeczy:
var nullDetected = new string[] { someNullString }.HasNull();
Skoro jesteśmy przy użyciu metody rozszerzenie, możemy dodatkowo wykorzystać funkcję dodając przeciążeń dla poszczególnych przypadków. Na przykład pusty ciąg może być traktowany w taki sam sposób, jak String.IsNullOrEmpty
. W tym przypadku chciałbym dodać dodatkową metodę rozszerzenia HasNullOrEmpty
:
public static bool HasNullOrEmpty(this IEnumerable<string> collection)
{
foreach (var item in collection)
{
if (string.IsNullOrEmpty(item))
{
return true;
}
}
return false;
}
Choć handel jest, że typ musi być IEnumerable<string>
'foreach' wymaga, aby były w' IEnumerable'. Jeśli konkretnie chcesz 'foreach', musisz umieścić każdą z nich w kolekcji. –
Czy chcesz sprawdzić ** ALL ** zmiennych w funkcji lokalnej lub tylko podzbiór? –
@ p.campbell faktycznie być precyzyjnie foreach potrzebuje IEnumerable –