可空类型的优雅模式
Elegant pattern for nullable types
我有以下构造:
MyType y = x.HasValue ? f(x) : null;
我知道如果 f
是 x
的成员可以使用一个简单的模式:MyType y = x.?f();
有没有类似的方法可以在不改变f
定义的情况下简化上面的代码?
目前(2015年11月),C#中不存在这样的机制。
选项是:
- 当参数为
null
时,将f
改为returnnull
- 做一个扩展方法
static R Call<P>(this P? parameter, Func<P, R> func)
{
if (parameter.HasValue)
return func(parameter.Value);
else
return default(R);
}
我能想到的最接近的是空合并运算符'??'
来自MSDN:
// Set y to the value of x if x is NOT null; otherwise
// if x == null, set y to -1
y = x ?? -1;
假设 f()
可以处理 x
成为 null
并且如果不能处理 return null
,那么你可以只做 MyType y = f(x)
,这听起来像你的最好的选择。请记住,除了更改函数以处理 x 为 null 之外的任何事情都需要您记住自己做,并记住原因,从而为自己动手创造空间并移除抽象层。
此外,f(x)
不是采用可为 null 的类型,因此无论如何都期待一个吗?
我有以下构造:
MyType y = x.HasValue ? f(x) : null;
我知道如果 f
是 x
的成员可以使用一个简单的模式:MyType y = x.?f();
有没有类似的方法可以在不改变f
定义的情况下简化上面的代码?
目前(2015年11月),C#中不存在这样的机制。
选项是:
- 当参数为
null
时,将 - 做一个扩展方法
f
改为returnnull
static R Call<P>(this P? parameter, Func<P, R> func)
{
if (parameter.HasValue)
return func(parameter.Value);
else
return default(R);
}
我能想到的最接近的是空合并运算符'??'
来自MSDN:
// Set y to the value of x if x is NOT null; otherwise
// if x == null, set y to -1
y = x ?? -1;
假设 f()
可以处理 x
成为 null
并且如果不能处理 return null
,那么你可以只做 MyType y = f(x)
,这听起来像你的最好的选择。请记住,除了更改函数以处理 x 为 null 之外的任何事情都需要您记住自己做,并记住原因,从而为自己动手创造空间并移除抽象层。
此外,f(x)
不是采用可为 null 的类型,因此无论如何都期待一个吗?