Coalesce
Ofta kommer jag på mig själv med att skriva långa och inte särskilt vackra if-satser till funktioner som kan returnera null. Det kan t.ex. vara:
DateTime start = ScheduleHelper.GetPeriodById(id) != null ? ScheduleHelper.GetPeriodById(id).Start : DateTime.Min;
Jag var inspirerad av SQL:s COALESCE-funktion, och eftersökte något liknande när min före detta kollega ledde mig in på följande spår.
public static T Coalesce<t>(params Func<t>[] p) {
foreach (var func in p) {
try {
T r = func();
if (r == null) continue;
if ((typeof(T) == typeof(string))) {
if (!string.IsNullOrEmpty(r.ToString()))
return r;
}
else if (!r.Equals(default(T))) {
return r;
}
}
catch {
continue;
}
}
return default(T);
}
Med denna funktion skapar man alltså en hierarkisk ordning av önskade returvärden, t.ex.
DateTime start = Coalesce(
() => ScheduleHelper.GetPeriodById(id).Start,
() => ScheduleHelper.GetPeriodByDay(day).Start);
Skulle då GetPeriodById().Start returnera null (eller inte vara instansierat), försöker man med GetPeriodByDay().Start och slutligen returneras defaultvärdet för typen.
