Archive for December, 2011

My check null

December 20, 2011

There are many solutions on the net for avoiding the null check. Here is mine:

public interface Option<T> { }

public struct Nothing<T> : Option<T> { }

public struct Just<T> : Option<T>
{
    public readonly T Value;

    public Just(T value) { Value = value; }
}

public static class OptionExtentions
{
    public static Option<T> ToOption<T>(this T value)
    {
        return (value == null)
            ? new Nothing<T>() as Option<T>
            : new Just<T>(value);
    }

    public static U Select<T, U>(this Option<T> option,
      Func<T, U> func)
    {
        return option.Select(func, () => default(U));
    }

    public static U Select<T, U>(this Option<T> option, 
      Func<T, U> whereJust, Func<U> whereNothing)
    {
        return option is Just<T>
            ? whereJust(((Just<T>)option).Value)
            : whereNothing();
    }
}

And implementation:

return (from h in HttpContext.Current.ToOption()
       select h.User);