我有一堆字符串我需要使用.Trim(),但它们可以为null。如果我可以这样做,那将更加简洁:
string endString = startString !?? startString.Trim();
如果左边的部分为非null,则基本上返回右边的部分,否则只返回空值。我刚刚使用了三元运算符,但是为了这个目的,还是使用空合并运算符吗?
答案 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();