空参数替代C#6.0

时间:2017-07-15 09:15:24

标签: c# c#-6.0

我在C#6中看到了一个新功能,它允许代码跳过ifnull个语句。

例如:

return p?.ToString();

如何调用p需要作为参数传递的方法(没有旧的if / else)?

我通常用C#pre-6编写的方式:

 p != null ? callmethod(p) : null

在C#6中有更好的东西吗?

4 个答案:

答案 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):"";