否定null-coalescing运算符

时间:2010-05-17 21:17:27

标签: c# null-coalescing-operator

我有一堆字符串我需要使用.Trim(),但它们可以为null。如果我可以这样做,那将更加简洁:

string endString = startString !?? startString.Trim();

如果左边的部分为非null,则基本上返回右边的部分,否则只返回空值。我刚刚使用了三元运算符,但是为了这个目的,还是使用空合并运算符吗?

9 个答案:

答案 0 :(得分:12)

不符合规范:不是我喜欢它,但您可以使用:

string endString = (startString ?? String.Empty).Trim();

要符合规范,更好的扩展方法,如@ Kevin's:

string endString = (startString == null ? null : startString.Trim());

答案 1 :(得分:12)

您可以创建一个扩展方法,在尝试修剪该值时返回null

public String TrimIfNotNull(this string item)
{
   if(String.IsNullOrEmpty(item))
     return item;
   else
    return item.Trim();
}

请注意,您无法将其命名为Trim,因为扩展方法无法覆盖实例方法。

答案 2 :(得分:4)

string endString = string.IsNullOrEmpty(startString) ? startString : startString.Trim();

虽然我也已经开始编写一个名为“safeTrim”的字符串扩展方法,它在一种方法中执行您所描述的内容,而不是每次都必须使用此配方。查看Kevin's respone代码。

编辑:哇我有各种各样的倒退,错误命名变量和反转三元运算符,更有理由编写一个扩展方法并且代码检查它比我做得更好!

答案 3 :(得分:1)

使用

string endString = (startString ?? "").Trim();

如果start String为null,则使用空字符串。但是,当endString为空时,会返回null。

答案 4 :(得分:1)

对不起,但是我遇到了同样的问题,我使用lambda操作解决了这个问题。它不是最漂亮的,但它使我的代码简洁。

遗憾的是C#不支持静态导入或单个函数导入,但无论如何:

在某处定义此功能:

private static TResult N<TParent,TResult>(TParent parent, Func<TParent,TResult> operation) {
    if( parent == null ) return default(TResult);
    return operation( parent );
}

然后在你的例子中使用它:

String endString = N(startString, s => s.Trim());

如果第一个参数为null,则N函数返回null,否则它将使用值作为参数计算指定的lambda函数。

当然,你可以嵌套它。例如,要安全地取消引用长链,例如

String someValue = someObject.SomeProperty.SomeOtherProperty.SomeMethod().SomeFinalProperty;

如果这些属性或方法中的任何一个返回null,那么你必须在任何地方插入空检查,或者你可以这样做:

String someValue = N(N(N(N(someObject, o => o.SomeProperty), o => o.SomeOtherProperty), o => o.SomeMethod()), o => o.SomeFinalProperty);

正如我所说,它不是最漂亮的:)。

您可以通过N System.Object的扩展方法来简化此操作,如下所示:

String someValue = someObject.N( o => o.SomeProperty ).N( o => o.SomeOtherProperty ).N( o => o.SomeMethod() ).N( o => o.SomeFinalProperty );

...我认为这更加整洁。

答案 5 :(得分:0)

以下内容不会传播null,但它接受null作为参数,并在这种情况下返回一个空字符串。

using Microsoft.VisualBasic;  // you need to add a reference to Microsoft.VisualBasic.dll

    ...
    string endString = Strings.Trim(startString);
    ...

<子>鸭&安培;运行...

答案 6 :(得分:0)

创建一个方法,例如:

string MyTrim(string a) {
    if (a != null) {
        a = a.Trim();
    }
    return a;
}

答案 7 :(得分:0)

如旁注所示,如果您使用的是.NET 4,则可以使用一种新的便捷方法String.IsNullOrWhiteSpace

答案 8 :(得分:0)

从C#6.0(.NET Framework 4.6 / Visual Studio 2015)开始,您可以使用null-conditional member access

 string? endString = startString?.Trim();