我看到了 C# 6 的新功能,允许代码跳过 null
检查的 if
语句。
例如:
return p?.ToString();
如何在不使用旧的if/else语句的情况下调用需要传递参数p的方法?针对这种情况,我通常会按照以下的C# pre-6写法:
p != null ? callmethod(p) : null
C# 6有更好的东西吗?
null
值一起使用this
参数(令人惊讶!),而对于普通实例方法,否则你会得到NullReferenceException
。?.
“安全导航”运算符: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
中,则可以使用lambda表达式来实现:
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 ) );
null
检查,替代方案是使用??
运算符,用法如下:someMethod(val??"0");// this means that "0" will be passed as a value if val is null
value
为空,则仍需要检查空字符串。public static class extension
{
public static void callmethod (this string myInput)
{}
}
因此,您将能够实现
p?.callmethod();
没有使用'if else',你可以通过以下代码实现-
p!=string.Empty?callmethod(p):"";
callmethod(p)
并检查 p
是否等于 callmethod(p)
返回的结果。 - Samvel Petrosov
callmethod(p ?? string.Empty)
。 对于“最佳”的定义有一定限制。 - ClickRickcallMethod
的使用者不应该关心/知道方法具有哪些验证规则 - 他们只需传递满足方法契约/签名的参数即可。如果您从其他地方获取p
并希望在进一步传递之前进行验证 - 为了可读性,最好像以前那样显示您的意图进行验证。 - Fabio