我以json的形式从客户端收到一些数据。 我写的是这样的:
string TheText; // or whould it be better string TheText = ""; ?
TheText = ((serializer.ConvertToType<string>(dictionary["TheText"])).Trim());
如果从json解析的变量返回空,那么当我调用.Trim()方法时,这段代码会崩溃吗?
感谢。
答案 0 :(得分:20)
如果序列化程序返回一个空字符串,Trim
将不执行任何操作。
如果序列化程序返回null
,您将在NullReferenceException
的通话中获得Trim
。
您的代码编写得更好(就初始化而言),如下所示:
string theText =
((serializer.ConvertToType<string>(dictionary["TheText"])).Trim());
声明和初始化变量并立即分配给它是没有意义的。
如果您不知道序列化程序可能返回的内容,以下内容最安全:
string theText = ((serializer.ConvertToType<string>(dictionary["TheText"])));
if(!string.IsNullOrEmpty(theText))
{
theText = theText.Trim();
}
答案 1 :(得分:12)
在空字符串上调用Trim()
将导致空字符串。在Trim()
上拨打null
会抛出NullReferenceException
答案 2 :(得分:9)
如果您希望修剪一些字段,但是对于那些在某些字段中具有空值的记录获得例外,则编写快速扩展方法将是最简单的方法:
public static class ExtensionMethods
{
public static string TrimIfNotNull(this string value)
{
if (value != null)
{
return value.Trim();
}
return null;
}
}
使用示例:
string concatenated = String.Format("{0} {1} {2}", myObject.fieldOne.TrimIfNotNull(), myObject.fieldTwo.TrimIfNotNull(), myObject.fieldThree.TrimIfNotNull());
答案 3 :(得分:9)
您可以使用elvis运算符:
GetNullableString()?.Trim(); // returns NULL or trimmed string
答案 4 :(得分:5)
不,将<{1}}初始化为TheText
更好。你之后就分配了它。
不,它不会崩溃 - ""
在空字符串上运行正常。如果“空”意味着它可以为空,那么是的,它会崩溃;你可以使用null条件调用将null保持为null:
Trim()
答案 5 :(得分:3)
正如一些评论中所建议的那样,您现在可以使用这种语法使用c#6 Null条件运算符:
onDrop: function(table, row) {
doWork(table, row)
}
答案 6 :(得分:3)
在修剪之前针对null
检查字符串的一些基本技术:
(mystring ?? "").Trim()
??
将返回第一个操作数。仅当此操作数为null时,才会返回第二个操作数(作为一种默认值)。mystring?.Trim()
?
将简化点表示形式的一系列操作。如果操作数为null,则将不执行以下操作,并且将返回null。if( string.IsNullOrWhiteSpace(mystring) ) { ... }
IsNullOrWhiteSpace()
方法可以代替修整。如果操作数为null,空或除空白字符外什么都不返回,则返回true。答案 7 :(得分:0)
您可以将此代码用作beblow
string theText = (((serializer.ConvertToType<string>(dictionary["TheText"])))+ string.Empty).Trim();
答案 8 :(得分:0)
您可以使用trim
中的空安全运算符org.apache.commons.lang
StringUtils.trim(stringOrNull)