Java 1.8 is receiving the Optional<T>
class, that allows us to explicitly say when a method may return a null value and "force" its consumer to verify if it is not null (isPresent()
) before using it.
I see C# has Nullable<T>
, that does something similar, but with basic types. It seems to be used for DB queries, to distinguish when a value exists and is 0 from when it doesn't exist and is null.
But it seems that C#'s Nullable<T>
doesn't work for objects, only for basic types, while Java's Optional<T>
only works for objects and not for basic types.
Is there a Nullable/Optional class in C#, that forces us to test if object exists before extracting and using it?
Not in the language, no, but you can make your own:
public struct Optional<T>
{
public bool HasValue { get; private set; }
private T value;
public T Value
{
get
{
if (HasValue)
return value;
else
throw new InvalidOperationException();
}
}
public Optional(T value)
{
this.value = value;
HasValue = true;
}
public static explicit operator T(Optional<T> optional)
{
return optional.Value;
}
public static implicit operator Optional<T>(T value)
{
return new Optional<T>(value);
}
public override bool Equals(object obj)
{
if (obj is Optional<T>)
return this.Equals((Optional<T>)obj);
else
return false;
}
public bool Equals(Optional<T> other)
{
if (HasValue && other.HasValue)
return object.Equals(value, other.value);
else
return HasValue == other.HasValue;
}
}
Note that you won't be able to emulate certain behaviors of Nullable<T>
, such as the ability to box a nullable value with no value to null, rather than a boxed nullable, as it has special compiler support for that (and a some other) behavior.