否定null-coalescing运算符

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

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

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

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

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

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

不是规格:不是我喜欢它,但你可以使用:

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

对于规范,更好的扩展方法,如@ Kevin’s:

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

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

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

使用

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

如果startString为null,则使用empy字符串。 但是,当endString为null时,这不会返回null。

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

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

在某处定义此function:

 private static TResult N(TParent parent, Func 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 ); 

…我认为这更整洁。

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

 using Microsoft.VisualBasic; // you need to add a reference to Microsoft.VisualBasic.dll ... string endString = Strings.Trim(startString); ... 

鸭和运行…

创建一个方法,例如:

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

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

从C#6.0(.NET Framework 4.6 / Visual Studio 2015)开始,您可以使用空条件成员访问 :

  string? endString = startString?.Trim();