我在C#6中看到了一个新功能,它允许代码跳过if
次null
个语句。
例如:
return p?.ToString();
如何调用p
需要作为参数传递的方法(没有旧的if
/ else
)?
我通常用C#pre-6编写的方式:
p != null ? callmethod(p) : null
在C#6中有更好的东西吗?
答案 0 :(得分:8)
您可以使用扩展方法 - 您可以将其推广到任何情况。这是有效的,因为C#允许扩展方法使用null
参数的this
值(令人惊讶!),而使用普通实例方法,您将获得NullReferenceException
。
在我们拥有?.
" safe-navigation"之前,这里的内容类似于我在自己项目中使用的内容。 C#6中的运算符:
public static class Extensions
{
public static TRet NullSafeCall<TValue,TRet>( this TValue value, Func<TValue,TRet> func )
where TValue : class
where TRet : class
{
if( value != null ) return func( value );
return null;
}
}
像这样使用:
return p.NullSafeCall( callmethod );
如果您需要在后续func
中传递多于1个参数,它还支持使用lambdas:
String foo = "bar";
return p.NullSafeCall( v => callmethod2( v, foo ) );
在您的示例中,您使用的是String.IsNullOrEmpty
而不是!= null
,可以像这样添加:
public static class Extensions
{
public static TRet NullSafeCall<TValue,TRet>( this TValue value, Func<TValue,Boolean> guard, Func<TValue,TRet> func )
where TValue : class
where TRet : class
{
if( guard( value ) ) return func( value );
return null;
}
}
用法:
return p.NullSafeCall( v => String.IsNullOrEmpty( v ), v => callmethod( v ) );
当然,你可以链接它:
return p
.NullSafeCall( callmethod2 )
.NullSafeCall( callmethod3 )
.NullSafeCall( v => callmethod4( v, "foo", bar ) );
答案 1 :(得分:2)
关于Null条件运算符,您可以阅读here。
参数检查null
的替代方法是??
运算符,其使用方式如下:
someMethod(val??"0");// this means that "0" will be passed as a value if val is null
但这与检查空字符串无关。因此,如果不允许value
,则必须检查空字符串。
答案 2 :(得分:2)
使用if语句的AFAIK很好,因为它非常清楚地表达了你的意图。另一种减轻此功能的方法是在字符串上创建一个扩展方法&#34; callmethod&#34;
public static class extension
{
public static void callmethod (this string myInput)
{}
}
因此,你可以做到
p?.callmethod();
答案 3 :(得分:0)
如果没有'if else',您可以使用以下代码 -
来实现p!=string.Empty?callmethod(p):"";