Существует прямая поддержка этого в TPL в .NET 4.0;
(редактировать: приведенное выше предложение было написано в ожидании System.Threading.WriteOnce<T>
, которое существовало в битах «предварительного просмотра», доступных в то время, но, похоже, оно испарилось до того, как TPL достигнет RTM / GA)
до тех пор, просто сделайте проверку сами ... это не так много строк, насколько я помню ...
что-то вроде:
public sealed class WriteOnce<T>
{
private T value;
private bool hasValue;
public override string ToString()
{
return hasValue ? Convert.ToString(value) : "";
}
public T Value
{
get
{
if (!hasValue) throw new InvalidOperationException("Value not set");
return value;
}
set
{
if (hasValue) throw new InvalidOperationException("Value already set");
this.value = value;
this.hasValue = true;
}
}
public T ValueOrDefault { get { return value; } }
public static implicit operator T(WriteOnce<T> value) { return value.Value; }
}
Затем используйте, например:
readonly WriteOnce<string> name = new WriteOnce<string>();
public WriteOnce<string> Name { get { return name; } }